1变量的作用域
1.1变量的作用域
变量在程序中能够使用的范围。
1.2全局变量
1.声明在函数或者类的外部的变量都是全局变量。
2.全局变量是从声明开始到整个py文件结束,任何位置都可以使用(作用域:从声明开始到文件结束)。
1.3局部变量
1.声明在函数或者类的里面的变量都是局部变量
2.局部变量是从声明开始到函数结束,任何位置都可以使用(作用域:从声明开始到函数结束).
# x和y是全局变量
for x in range(10):
y = 20
print(x)
print(x, y)
# num1, num2, aa, xx都是局部变量
def func2(num1, num2):
print(num1, num2)
aa = 11
print(aa)
for xx in range(5):
print(xx)
print(xx)
1.4 global关键字
gloabl关键字只能在函数中使用,作用是用来在函数中声明一个全局变量。
语法:
gloabl 变量名
变量名 = 值
a1=100 # 全局变量
def test1():
global a1
a1 = 200
print('全局变量a1:',a1) # 全局变量a1: 200
1.5 nonlocal关键字
nonlocal关键字只能在函数中使用
当需要在局部的局部中修改局部变量的值,就使用nonlocal
语法:
nonlocal 变量名
变量名 = 值
def func1():
a2='abc'
def func11():
nonlocal a2
a2='python'
print('func11-a2:',a2)
a3=111
# a3的作用域在func11中
func11() # func11-a2: pyhton
func1()
global可以多次对全局变量进行修改。
a1=10
def ad():
global a1
a1=5
print(a1) # 5
a1=20
print(a1) # 20
ad()
print(a1) # 20
2 函数作为变量
python中,声明函数其实就是声明一个类型是function的变量。函数名就是变量名;函数名作为变量除了可以用来调用函数获取返回值以外,普通变量能做的它都能做。
# 声明类型是function类型的变量c
c=lambda x:x*x
print(type(c)) # <class 'function'>
# 声明类型是function类型的变量d
def d(x):
return x*x
print(type(d)) # <class 'function'>
函数名加括号是调用函数,不加括号就是代表整个函数部分(不是调用函数)。
2.1用函数给另一个函数赋值
# 声明一个函数变量func11
def func11():
print('我是函数')
# 使用函数变量func11给ff赋值
ff=func11
# 将ff当成函数来用
ff() # 我是函数
2.2 函数作为容器的元素
# 声明一个函数变量func2
def func2():
print('我是函数2')
# 将函数变量作为列表list2的元素
list2=[func2,100]
print(list2[0]()) # 我是函数2(执行函数体),None(函数的返回值)
2.3函数作为函数的参数
将函数1作为实参,传递给函数2;这儿的函数2就是一个高阶函数(实参高阶函数)
sort和max及min都是高阶函数。
def sort(key=None,reverse=False)
key-确定排序的时候以什么值为标准来排序(默认情况下,以列表的元素的大小为标准)。
需要传一个函数,函数需要一个参数和一个返回值。这儿的参数是列表的元素
reverse-是否降序排序,需要传一个bool值。
def yt_sort(list1,key=None):
# 列表排序
if key==None:
for index in range(len(list1)):
for index2 in range(index+1,len(list1)):
current=list1[index]
behind=list1[index2]
if behind<current:
list1[index],list1[index2]=list1[index2],list1[index]
# 字典排序
else:
for index in range(len(list1)):
for index2 in range(index+1,len(list1)):
current=key(list1[index])
behind=key(list1[index2])
if behind<current:
list1[index], list1[index2] = list1[index2], list1[index]
# 列表排序
my_list=[1,34,20,89,8]
yt_sort(my_list)
print(my_list) # [1, 8, 20, 34, 89]
# 字典排序
my_list2=[{'name:':'张三','age:':18},
{'name:':'李四','age:':27},
{'name:':'王武','age:':15}]
def get_age(x):
return x['age:']
yt_sort(my_list2,get_age)
print(my_list2)
# 按元祖中的第二项取最大值
list1=[('z',10),('b',30),('c',20)]
print(max(list1,key=lambda item:item[1]))
2.4 函数作为函数的返回值
返回值是函数的函数,也叫高阶函数(返回值高阶函数)
def get_operation(char):
if char=='+':
# 求和的功能
def sum(*args,**kwargs):
"""求多个数的和"""
sum1=0
for item1 in args:
sum1+=item1
for item2 in kwargs:
sum1+=kwargs[item2]
return sum1
return sum
# re是一个函数
re=get_operation('+') # 即re=sum函数
# re(10,20,30)——调用函数获取和的返回值
print(re(10,20,30)) # 60
3 迭代器
3.1 什么是迭代器(iter)
迭代器是python中的容器类的数据类型,可以同时存储多个数据。
取迭代器中的数据只能一个一个的取,而且取出来的数据,在迭代器就不存在了。
3.2.迭代器中数据的来源
a.将其他序列转换成迭代器
b.使用生成式、生成器去产生数据
所有的序列都可以转换成迭代器。
3.2.1将字符串转换成迭代器
iter1 = iter('abcd')
print(iter1)
3.3获取迭代器中的元素
next(迭代器) / 迭代器.__next__() - 取出迭代器中第一个元素(已经取出来的元素再也回不到迭代器中了)。
iter1 = iter('abcd')
print(next(iter1))
print(iter2.__next__())
当迭代器是空的时候,使用next获取元素,会出现StopIteration异常。
3.3.1 通过for循环取出迭代器中每个元素
iter2=iter([1000,50])
for x in iter2:
print('==:', x)# ==: 1000 ; ==: 50
print(next(iter2)) #出现 StopIteration异常,因为for循环已经将这个迭代器中的元素取完了.
4 生成器
4.1 什么是生成器
生成器就是迭代器,迭代器不一定是生成器。
生成器就是带有yoeld的关键字的函数的结果
调用带有yield关键字的函数,拿到的结果就是生成器。生成器中的元素就是yield关键字后面的值。
4.2 生成器怎么产生数据
只要函数中有yield关键字,调用函数不会再执行函数体获取返回值,而是创建一个生成器。当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句为止,并且将yield后面的值作为结果返回。并且保存当前执行的位置。获取下一个元素的时候,就从上次结束的位置接着往下去执行函数,直到函数结束或者遇到yield为止。如果函数结束了,就出现StopTteration异常。
生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生的数据的个数。
def func1():
print('abc')
yield 102
re=func1()
print(re) # <generator object func1 at 0x00000186232297D8>
# next(re)-执行re对应的函数的函数体,将yield关键字后边的值作为结果
print('====:',next(re))
def numbers():
for x in range(1,101):
yield x
gener=numbers() # 调用生成器
print(next(gener)) # 1
print(next(gener)) # 2
print(next(gener)) # 3
print(next(gener)) # 4
利用生成器产生菲波拉契数列
def feibo():
yield 1
yield 1
first=1
second=1
while True:
third=first+second
yield third
first=second
second=third
re=feibo()
for num in range(6):
print(next(re))
def func1(a:int) -> int: # 前面对参数进行说明,后面int对返回值进行类型说明