错综复杂的复制
浅拷贝
list1=[1,2,3,4]
list2=list1 #或者list1[:] list(list1)均可实现浅拷贝
list2.append(5)
print(list1)
print(list2)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
修改一个列表,另外一个列表也会变换
列表的底层实现:
列表内的元素可以分散的存储在内存中
列表存储的,实际上是这些元素的地址------地址的存储在内存中是连续的
浅拷贝是将地址复制了一份给别的变量名
但是对元组操作时又不一样,这个时候像深拷贝
深拷贝 使用copy()
list1=[1,2,3,4]
list2=list1.copy()
list2.append(5)
print(list1)
print(list2)
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
可变类型: 列表,字典,集合
id保持不变,但是里面的内容可以变
可变对象+=操作 实际在原对象的基础上就地修改
更加简洁的语法
创建多维列表
ls=[[0]*10 for i in range(5)]
ls
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
解析语法的基本结构----以列表解析为例(也称为列表推导) [expression for value in iterable if conditihon]
三要素: 表达式,可迭代对象,if条件(可选)
执行过程:
-
从可迭代对象中拿出一个元素 -
通过if条件(如果有的话),对元素进行筛选 若通过筛选,则将元素传给表达式 若未通过,则进入下一次迭代 ? -
将传递给表达式的元素,代入表达式进行处理,产生一个结构 -
将第三步产生的结果作为列表的一个元素进行存储 -
重复1-4 步,直到迭代对象迭代结束,返回新创建的列表
#求20以内奇数的平方
res=[i**2 for i in range(1,21) if i%2==1]
print(res)
[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
?
支持多变量
x=[1,2,4]
y=[2,3,4]
res=[i*j for i, j in zip(x,y)]
res
[2, 6, 16]
支持循环嵌套
其它字典,集合的推导也类似
条件表达式
expr1 if condition else expr2
如果条件成立,执行expr1
如果不成立,执行expr2
#将n的绝对值赋予x
n=10
x=n if n>=0 else -n
x
生成器
采用惰性计算的方式
无需一次性存储海量数据
一边执行一边计算,只计算每次需要的值
实际上一直在执行next()操作,直到无值可取
生成器表达式 ()
res=(i**2 for i in range(1000000))
生成器函数----yield
def fib(max):
n,a,b=0,1,1
while n<max:
yield a
a,b=b, a+b
n=n+1
fib(10)
在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
迭代器
可迭代对象:
可以直接作用于for循环的对象统称为可迭代对象:iterable
列表,元组,字符串,字典,集合,文件
装饰器
需要对已开发上线的程序添加某些功能
不能对程序中函数的源代码进行修改
不能改变程序中函数的调用方式
高阶函数
- 接收函数作为参数
- 或者返回一个函数
满足上述条件之一的函数称之为高阶函数
def squ(x):
return x**2
def pow (fun):
return fun
f=pow(squ)
f(8)
64
#上面的pow便是一个高阶函数
嵌套函数
在函数内部定义一个函数
def outer():
print("outer is running ")
def inner():
print("inner is ruuning ")
inner()
outer()
outer is running
inner is ruuning
先执行外部函数,再执行内部函数
闭包:延申了作用域的函数
如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包
闭包时由函数及其相关的引用环境组合而成的实体
一旦在内层函数重新定义了相同名字的变量,则变量成为局部变量
|