笔记
地址
a='123'
b='123'
print(a==b)
print(a is b)##True,不可变类型的id相同,地址相同
print(id(a))#相同
print(id(b))#相同
a=3
b=a
b=6
print(a)
a=[1,2,3]
b=[1,2,3]
print(a==b)#true
print(a is b)##false可变类型的id不同,地址不同
print(id(a))#不同ID
print(id(b))#不同id
x=[1,2,3]
y=x.copy()
print(y)
print(id(y))#false可变类型的id不同,地址不同
print(id(x))#false可变类型的id不同,地址不同
print(x is y)
def hanshu(a,b):
print(id(a))
a=10
print(id(a))
c=a+b
return c
x=5
print(id(x))
y=6
print(id(y))
z=hanshu(x,y)#16
print(z)
print(x)#5
a=[1,2,3,4]
y=[4,5,6]
def modify(b,c):
print(id(b))
c=[5,6,7]
b.append(5)
print(id(b))
print(id(a))#id
modify(a,y)#id,id
print(a)#[1,2,3,4,5]
print(y)#[4,5,6]
不建议将可变类型作为默认参数,因为会造成歧义
def hanshu(a=[]):
a.append('h')
print(a)
hanshu()
hanshu()
命名空间的访问,局部变量,全局变量
def hanshu(a,b):
xy=5
hah=9
print(locals())
x=0
y=1
hanshu(x,y)
asfa=123445
print(globals())
局部变量只能在函数内使用,全局变量作用域在整个程序
a=[1,2,3]
def hanshu():
x=3
y=45
print(a)
hanshu()#[1,2,3]
print(a)#[1,2,3]
y=12223
print(y)#12223
#print(x)#不能答应因为是局部变量
定义要放在函数调用之前,否则会报错
a=3
def hanshu():
print(a)
print(b)
print(c)
b=4
hanshu()
c=5##要放在函数调用的前面,否则会报错
全局变量可以和局部变量重名,互不干扰
a=3
def hanshu():
a=5
print(a)
hanshu()#5
print(a)#3
错误eg1:
a=3
def hanshu():
print(a)#报错,未定义,就输出值了
a=5
print(a)
hanshu()
print(a)
eg2.
a=3
def hanshu():
a+=5##报错,未定义
print(a)
hanshu()
print(a)
#全局变量是不可变类型,函数无法修改全局变量的值
a=3
def hanshu():
a=5
print(a)
hanshu()
print(a)
全局变量是可变类型,函数可以修改全局变量
> a=[1,2,3,4] def hanshu():
> a.append(10)
hanshu()
print(a)##a为[1,2,3,4,10]
函数当中,带等号就是局部变量,不能再修改全局变量的值
a=[1,2,3,4]
def hanshu():
a=[7,8,9]#带等号就是局部变量,不能再修改全局变量的值
hanshu()
print(a)
内部函数
def hanshu1():#2
a=2##3
def hanshu2(a,b):#6
z=a+b#7
return z#8
b=3#4
d=hanshu2(a,b)#5
return d#9
print(hanshu1())#1
global函数,将局部变量,变为全局变量
b=3
def hanshu2():
global b
b+=4
print(b)
print(b)#b=3
hanshu2()#b=7
nonlocal,修改外层函数,非全局函数
b=3
def hanshuw():
a=1
b=6
def hanshu_nei():
nonlocal a
nonlocal b
a=2
b=5
print(a)#a=1
hanshu_nei()
print(b)#b=5
hanshuw()
print(b)#3
作用域按照变量的定义位置可以划分四类即LEGB
Local(内部函数)局部作用域
Eclosing(嵌套函数的外层函数内部)嵌套作用域(闭包)
Global(模块全局),全局作用域
built-in(内建)内建作用域。指的是(builtins.py模块)
a=1
b=4
c=6
def hanshuw():
a=2
b=5
def hanshu_n():
a=3
print(a)#3
print(b)#5
print(c)#6
print(max,__name__)
hanshu_n()
hanshuw()
匿名函数
d=lambda x,y:x*2+y
z=d(5,6)
print(z)
abs()函数,取绝对值
eg1:
a=-1
print(abs(a))
eg2:
a=[1,2,3,4,-5]
b=max(a,key=abs)#取绝对值最大的数,max内部去调用abs函数
print(b)#输出5
def hanshu(a):
return a*-1
a=[10,20,30,-50]
b=max(a,key=hanshu)##输出-50
print(b)
sort函数的用法
a=[1,2,-3,-5,4]
a.sort(key=abs)
print(a)#1,2,-3,4,-5
map函数是映射
def hanshu(a):
return a*a
x=[1,2,3]
y=map(hanshu,x)
print(y)
for d in y:
print(d)
filter函数,过滤掉不符合条件的
def aaa(a):
if a%3==0:
return True
x=[1,2,3,4,5,6,7,8,9]
d=filter(aaa,x)
print(d)
for i in d:
print(i)
print(x)
zip函数,配对,长度不一致,取最短输出,返回类型是元祖
a=[1,2,3,4]
b=['a','b','c']
d=zip(a,b)
print(d)
for i in d:
print(i)
将a,b输出为[{‘a’: ‘c’}, {‘b’: ‘d’}]
a=('a','b')
b=('c','d')
x=list(map((lambda a:{a[0]:a[1]}),zip(a,b)))
print(x)
eg1:
a = [1, 10, 2, 20, 3, 30, 4, 40]
f = []
for i in range(0, len(a), 2):
f.append(a[i]+a[i+1])
print(f)
b = f[::2]
c = f[1::2]
d = map(lambda x: ({x[0]: x[1]}), zip(b, c))
print(list(d))
输出年龄最大的,以及按年龄排列
a=[{"name":"张三",'age':18},
{"name":"李四",'age':28},
{"name":"wangwu",'age':48},
{"name":"xiaoming",'age': 8},
]
def hanshu(a):
return a['age']
m=max(a,key=hanshu)
print(m)
a.sort(key=hanshu)
print(a)
m=max(a,key=lambda a:a['age'])
print(m)
作业
不可变数据类型和可变数据类型自加的区别
def demo(num, num_list):
num += num
num_list += num_list
print(num)
print(num_list)
print("函数完成")
gl_num = 9
gl_list = [1, 2, 3]
demo(gl_num, gl_list)
print(gl_num)
print(gl_list)
2.# 传值和传址问题
请说出 list1,list2,list3 的值是什么,并且说明为什么
def extendlist(val, lis=[]):
lis.append(val)
return lis
list1 = extendlist(10)#[10]
list2 = extendlist(123, [])#[123]
list3 = extendlist('a')#[a]
print(list1) # [10,'a']
print(list2) # [123]
print(list3) # [10,'a']
3.# 匿名函数
请说出acts0的值,并且说明为什么
def makeActions():
acts = []
for i in range(5):
acts.append(lambda x: i ** x)
return acts
acts = makeActions()
print(acts[0](2))
print(acts[1](2))
print(acts[2](2))
print(acts[3](2))
print(acts[4](2))