1 set 集合
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.remove(4)
>>> s
{1, 2, 3}
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
2. pass占符,可以让没有实现好的模块将代码运行起来
def nop():
pass
3. 函数可以返回两个值,可以用两个变量来接收,也可以用一个变量来接收(元组)
import math
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
4. 用函数定义一个函数
import math
def quadratic(a, b, c):
return lambda x: a*math.pow(x, 2) + b*x + c
5. 可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
*nums表示把nums这个list的所有元素作为可变参数传进去
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
6. 关键字参数
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
# 将一个字典以kw的形式传进去
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
7. 迭代器
class Fib(object):
def __init__(self):
self.a = 0
self.b = 1
def __next__(self):
self.a , self.b = self.b , self.a + self.b
return self.a
def __iter__(self):
return self
8. 迭代(Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上)
for key in d # 迭代key
for value in d.values() # 迭代values
for k, v in d.items() # 迭代key和values
# 判断是否可以迭代
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
# enumerate可以将一个可迭代的对象搞成索引-元素对
for i, value in enumerate(['A', 'B', 'C'])
# 以元祖为单位遍历
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
9. 列表生成式--[]前面是式子描述生成规则,循环生成还可以加上限制条件
[x * x for x in range(1, 11)]
[x * x for x in range(1, 11) if x % 2 == 0]
[m + n for m in 'ABC' for n in 'XYZ']
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
10. 生成器:generator,一边循环一边计算用于节约内存
- 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成()
- 怎么打印出generator的每一个元素呢?通过next()函数获得generator的下一个返回值
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
……
# 生成器可以用于迭代
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
# yield可以帮助实现一步步迭代
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
11. yield与next
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
12. 用生成器实现杨辉三角型
#encoding:utf-8
def triangles(n):
res = [1]
i = 0
while i < n:
yield res
i = i + 1
res_temp = [1]
j = 0
while j < len(res) -1 :
res_temp.append(res[j] + res[j+1])
j = j+1
res_temp.append(1)
res = res_temp
# 实现了生成器可以用for进行循环
for n in triangles(9):
print n
# 也可以获取对象后,用next遍历
o = triangles(5)
print o
print next(o)
print next(o)
print next(o)
13. 迭代与生成器
可以直接作用于for循环的数据类型有以下几种:
- 一类是集合数据类型,如list、tuple、dict、set、str等;
- 一类是generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象
生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
- 可以使用isinstance()判断一个对象是否是Iterator对象
把list、dict、str等Iterable变成Iterator可以使用iter()函数