python的特性:
#切片
d=['a',3,'ahng',2333]
for x in d[1:3]: #截取列表索引号为1,2的元素,不包含3,类似左闭右开[1,3)
print(x)
for x in d[-3:-1]: #切片同样支持负号倒数取元素,此时为左开右闭
print(x)
#迭代
#字典迭代举例
f={'a':97,'b':98,'c':99}
#迭代输出key
for x in f:
print (x)
#迭代输出value
for x in f.values():
print (x)
#列表生成式
#[表达式 for ... in ... if ...]
l=[x*x for x in range(1,10)]#创建1到9的平方的数列
for x in l:
print (x)
l=[x*x for x in range(1,9) if x%2==1]#创建1到9中奇数的平方的数列
for x in l:
print (x)
l=[x+y for x in 'abc' for y in 'def'] #利用双层循环创建一个全排列列表
for x in l:
print (x)
#生成器
#例子:
l=(x*x for x in range (1,10)) #此时l是一个生成器
#>>> l
#<generator object <genexpr> at 0x000001D3F0672740>
#生成器generator保存的是算法,可以通过next(l)取得l的下一个值
#generator是可以迭代的,如下
for x in l:
print (x)
#稍复杂的generator
def isprimenumber(n):
for i in range(2,n):
if n==2:
return 1
if n%i==0:
return 0
return 1
def generator (max):
for x in range (2,max):
flag=isprimenumber(x)
if flag==1:
yield x
#普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
#而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
for y in generator(100):
print (y)
生成器的使用案例——杨辉三角:
def triangle():
l=[1]
while 1:
yield l
m=[l[i]+l[i+1] for i in range (0,len(l)-1)]
l=[1]+m+[1] #列表可以拼接
r=[]
n=1
for t in triangle():
r.append(t)
n=n+1
if n>=10:
break
for x in r:
print(x)
map函数:
#map函数接收两个参数,一个是函数,另一个是iterator如列表list等
#例子
def f(x):
return x*x
r=map(f,range(1,10))
l=list(r)#r是一个惰性的iterator,需要通过list()计算并传递给一个列表
for x in l:
print(x)
reduce函数:
#reduce函数,是把一个函数作用于一个序列,这个函数必须接收两个参数
#reduce会把函数返回的结果再次与序列的下一个元素传递给该函数,再次计算,直到最后一个元素
from functools import reduce
def f(x,y):
return x+y
print(reduce(f,[1,2,3,4])) #通过reduce求和
#例子,把字符串数字转换数字
def fn(x,y):
return (x*10+y)
def char2num(s):
d={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
return d[s]
string='1234567890'
print(reduce(fn,map(char2num,string)))
#map(char2num,string)把字符串转换成一个数字的iterator,fn再转换成数值