1.迭代
•可以通过 for 循环来遍历这个 list 或 tuple,这种遍历我
们称为迭代(Iteration)
•只要是可迭代对象,无论有无下标,都可以迭代,比如 dict
就可以迭代:
•默认情况下,dict 迭代的是 key。如果要迭代 value,怎么办?
for k,v in d.iteritems():
print k,v
可通过 collections 模块的 Iterable 类型判断是否是迭代对象
•python内置的枚举方法enumerate,把一个list 变成索引元素对
shopinfo = [
('Iphone',1000),
('book',200),
('fentiao',3500)
]
for i,v in enumerate(shopinfo):
print i,v
• for 循环里,同时引用了两个变量,在 Python 里是很常见的;
计算阶乘
def fact(n):
if not isinstance(n,int):
print 'input int num'
if n == 1:
return 1
return fact(n-1)*n
print fact(3)
二分法
def fun(n):
if not isinstance(n,int):
print 'Error Type'
print n
b = int(n/2)
if b > 0:
return fun(b)
fun(18)
2.列表生成式
列表生成式是Python 内置的非常简单却强大的可以用来创建list的生成式
思考:
要生成 list [1, 2, 3, 4, 5, 6, 7] 可以用 range(1, 8)
但如果要生成 [1x1, 2x2, 3x3, ..., 7x7] 怎么做?列表生成式
方法一:for循环
# [1,2,3,4,5,6,7] range(1,8)
# [1,4,9,16,25,36,49]
def fun():
li = []
for i in range(1,8):
# print i
li.append(i*i)
return li
print fun()
方法二:列表生成式
print [ i*i for i in range(1,8)]
循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list.
列表生成式可以嵌套if语句和for语句么?
- 生成20以内所有偶数的平方;
print [ i*i for i inrange(0,20,2)]
print [ i*i for i in range(0,20) if i %2== 0]
- 生成‘ABC’与‘123’的全排列;
print [ i+j for i in '123' for j in'ABC']
列表生成式也可以使用两个变量来生成 list么?
- 生成字典的的内容,格式为‘key=value’,返回其列表
格式;
- 将list中所有的字符串变为小写字母;
print [i.lower() for i in list if isinstance(i, str)]
3.生成器
为什么需要生成器?
•通过列表生成式,我们可以直接创建一个列表,受到内存限
制,列表容量肯定是有限的;
•创建一个包含 100 万个元素的列表,占用很大的存储空间;
生成器是什么?
• 在循环的过程中不断推算出后续的元素呢?这样就不必创
建完整的 list,从而节省大量的空间。在 Python 中,这种一
边循环一边计算的机制,称为生成器(Generator)
怎么创建生成器?把一个列表生成式的 [] 改成 ()
•使用g.next()方法依次读取元素(麻烦)
•使用 for 循环(推荐)
•理解生成器的实质,当无法通过列表生成式表述问题
时,如何通过函数实现生成式的功能。
python编程:著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13,21,...
fib 函数定义了斐波拉契数列的推算规
则,可以从第一个元素开始,推算出后续
任意的元素,逻辑非常类似 generator。
要把 fib 函数变成 generator,只需要
把print b 改为 yield b 就可以.
•函数顺序执行,遇return语句或最
后一行函数语句就返回。
•generator函数在每次调用
next() 的时候执行,遇到 yield 语
句返回,再次执行时从上次返回的
yield 语句处继续执行。
# 通过yield实现单线程的并发运算
# 异步I/O模型epoll http nginx tomcat
import time
def consumer(name):
print '%s 准备吃粉条了!' % (name)
while True:
fentiao = yield
print ('粉条[%s]做出来了,被[%s]吃了') %(fentiao, name)
# g = consumer('肖遥')
# g.next()
# g.send('孜然味')
def producer(name):
c1 = consumer('肖遥')
c2 = consumer('韩窑')
c1.next()
c2.next()
print '开始制作粉条晚餐了........'
for i in ['清蒸','油炸','爆炒']:
time.sleep(1)
print '[%s] 做了两份粉条,两个人一块吃' %(name)
c1.send(i)
c2.send(i)
producer('杨佳晨')