列表推导式
l11 = [1,2,34,5,5,6,54,6,8]
l22 = [12,32,44,65,768,9]
b = [x**2 for x in l11 if x < 10]
#print(b)
xy = [[x,y] for x,y in zip(l11,l22)]
print(xy)
函数参数-可变对象与不可变对象的传递
不可变类型传递的是值,相当于内容,不影响本身,只是修改了复制的对象;
可变类型是将本身传过去,在方法内部修改后,在外部也有同样的影响;
关于函数的返回值
函数并非总是将结果直接输出,想要把函数的结果返回给调用者,徐艳在函数中使用return;
return语句用于退出函数,选择性的向调用者返回一个式子。直接return的语句返回None;
一个函数里只会执行一次return,一次可以有多个发回值;
return后的语句不再执行;
print是将结果输出到控制台;return语句结束函数的调用,并将结果返回给控制台,需要通过print打印才能在控制台输出;
yield的作用是把一个函数变成一个generator;带有yield的函数不再是一个普通函数,Python解释器会将其视为一个生成器,调用此类型的函数时,会返回iterable迭代对象;
与return类似,都有返回值,但yield可以返回多次,return只能返回一次。使用yield返回结果的函数就是生成器,生成器一定是迭代器,反之不一定
迭代器
迭代是python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。从第一个元素开始访问,直到所有的元素被访问完毕时结束;
迭代器的基本方法:iter()和next()
字符串、列表、元祖和集合对象都可以用于创建迭代器;
List=[1,2,3]
it = iter(list) #创建迭代器对象
print(next(it)) #输出迭代器的下一元素
生成器(generator)
生成器是一个返回迭代器的函数,只能用于迭代操作,可以简单地理解为生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到yield时,函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次从当前位置继续运行。
生成器在python中是一个非常强大的编程结构,可以用更少的中间变量写流式代码,此外,相比其他容器更能节省内存和CPU。
生成器表达式使用括号(),是列表推导式的生成器版本,它返回
的是一个生成器对象如下:
a = (x*x for x in range(10))
print(a)
结果如下:
<generator object<genexpr> at 0x000001CD85FF9938>
小结:
1, 容器是一系列元素的集合,str、list、set、dict、file、sockets对象都可以看作是容器,容器都可以被迭代(用for、while的语句),因此他们被称为可迭代对象。
2, 可迭代对象实现了__inter__方法,该方法返回一个迭代对象。
3, 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,它实现了__next__和__iter__方法,迭代器不会一次性把所有元素加载到内存,而是在需要时生成返回结果。
4, 生成器是一种特殊的迭代器,它的返回值是通过yield。
全局变量
对于不可变类型的全局变量,在函数中修改需要global声明
对于可变类型的全局变量来说,要在函数中修改可以不使用global声明
局部变量,在函数内部定义的变量。
不同的函数,可以定义相同的名字的局部变量,相互不会产生影响。
Lambda表达式
表达式规则为,lambda 参数列表:表达式
Lambda的主体是一个表达式,不能写入太多的逻辑,其定义的函数的返回值就是表达式的返回值,不需要return。Lambda表达式的主要应用场景就是赋值给变量,作为参数传入其他函数。Lambda函数拥有自己的命名空间,且不能访问自有参数以外或全局命名空间里的参数。
a = lambda x : x * x
print(a(2))
递归函数
递归是指子程序(或函数)直接调用自己或间接调用自己,是一种描述问题和解决问题的基本方法。
实现斐波那契数列:
def Fibonacci(n):
if 0 <= n <= 2:
return 1
elif n>2:
return Fibonacci(n - 1) + Fibonacci(n- 2)
#a = Fibonacci(10)
常用的高阶函数
map(func,seq())接收一个函数及多个集合序列,根据函数对序列做映射,然后返回新的map对象。
#用map函数将两个列表相加返回给a2
l1 = [1,2,3,4]
l2 = [2,4,6,7]
a2 = map(lambda x,y:x+y,l1,l2)
print(list(a2))
filter(func,seq)用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的filter对象。
#找出列表l1中小于3的部分
a3 = filter(lambda x:x<3,l1)
print(list(a3))
reduce(func,seq)对于序列中的所有元素调用func进行数据合并,可以给一个初始值。Reduce传入的函数必须接受两个参数
#对l1求和
p = functools.reduce(lambda x,y:x+y,l1)
print(p)
#求和函数
p1 = lambda i:functools.reduce(lambda x,y:x+y,range(1,i+1))
print(p1(3))
Python闭包
如果在一个内部函数,对外部作用域(非全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。装饰器就是一种闭包。
def fx(x):
def fy(y):
return x*y
return fy
print(fx(3)(2))
在上面fy()就是闭包
def fc(name):
aa = 0
def fd():
nonlocal aa #nonlocal关键字指引python去外部寻找aa
aa += 1
print('hehe%s,%d'%(name,aa))
return fd
a = fc('hh')
print(a)