常规导入
** import sys **
你只需要使用import一词,然后指定你希望导入的模块或包即可。通过这种方式导入的好处是可以一次性导入多个包或模块:
** import os, sys, time **
虽然这节省了空间,但是却违背了Python风格指南。Python风格指南建议将每个导入语句单独成行。
使用from语句导入
很多时候你只想要导入一个模块或库中的某个部分。我们来看看在Python中如何实现这点:
** from functools import lru_cache **
上面这行代码可以让你直接调用lru_cache。如果你按常规方式导入functools,那么你就必须像这样调用lru_cache:
** functools.lru_cache(*args) **
根据你实际的使用场景,上面的做法可能是更好的。在复杂的代码库中,能够看出某个函数是从哪里导入的这点很有用的。不过,如果你的代码维护的很好,模块化程度高,那么只从某个模块中导入一部分内容也是非常方便和简洁的。
当然,你还可以使用from方法导入模块的全部内容,就像这样:
** from os import * **
** 切片 **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# list 切片
L = ['chen', 'li', 'jiang', 'wen']
print L[0:4]
print L[:3]
print L[-2:]
L = range(100)
print L[:10]
print L[-10:]
# copy list
N = L[:]
print N
# tuple 切片
L = (1, 2, 3, 4, 5)
print L[0:3]
# 字符串切片
L = 'chenwenbo'
print L[0:3]
# 间隔三个
print L[::3]
# 间隔二个
print L[::2]
** 迭代 **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import Iterable
# 迭代dict
dict = {'name': 'chenwenbo', 'age': 12}
# key
for o in dict:
print o
# value
for o in dict.itervalues():
print o
# item
for x, y in dict.iteritems():
print x
print y
# str
for str in "chenwenbo":
print str
# 判断对象是否可以迭代
print isinstance('chenwen', Iterable)
# Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
for i, value in enumerate('chenwenbo'):
print i, value
# 引用两个变量
for x, y in [(1, 2), (2, 3), (3, 4)]:
print x, y
** 列表生成式 **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
print [x for x in range(1, 22) if x % 2 == 0]
print [x*x for x in range(1, 22) if x % 2 == 0]
print [x.lower() for x in 'ABC']
# 多个返回值的列表生成式
d = {'x': 'A', 'y': 'B'}
print [x+y for x, y in d.iteritems()]
** 生成器 **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 列表生成式 []
L = [x*x for x in range(0, 10)]
print L
# 生成器 ()
g = (x*x for x in range(0, 10))
print g.next()
print g.next()
print g.next()
print g.next()
for x in g:
print x
# 自定义生成器
def fib(max):
n, a, b = 0, 0, 1
while n < max:
# 关键
yield b
a, b = b, a + b
n = n + 1
for f in fib(6):
print f
# generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。
# 要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
** filter **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print filter(lambda x: x > 10, [1, 2, 4, 5, 6, 9, 10, 15])
# 把一个序列中的空字符串删掉,可以这么写:
print filter(lambda x: (x and x.strip()), ['A', '', 'B', None, 'C', ' '])
** 高阶函数 **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 高阶函数
# 变量可以指向函数
f = abs
print f(-10)
# 函数名也是变量
cmp = 10
print cmp
# 报错 print abs(-10)
# 参数传入函数
def add(x, y, f):
return f(x) + f(y)
print add(1, 2, abs)
** map **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# map usage
def f(num):
return num * num
print map(f, [1, 2, 3, 4, 5])
print map(lambda x: x * x, [1, 2, 3, 4, 5])
** reduce **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# reduce usage
def char2num(str):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[str]
def str2int(s):
return reduce(lambda x, y: x + y, map(char2num, s))
print str2int('123')
** sorted **
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print sorted([22, 3, 51, 1, 521, 50, 134])
def new_sort(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
print sorted([22, 3, 51, 1, 521, 50, 134], new_sort)