一、变量的作用域
1、变量的作用域
变量在程序中能够使用的范围
2、全局变量
a.声明在函数或者类的外部的变量都是全局变量
b.变量的作用域:从声明开始到整个py文件结束,任何位置都可以使用(作用域:从声明开始到文件结束)
3、局部变量
a.声明在函数或者类的内部的变量就是局部变量
b.变量的作用域:从声明开始到函数结束,任何位置都可以使用
4、golbal的使用
golbal关键字只能在函数中使用
作用:在函数内声明一个全局变量
语法:
golbal 变量名
变量名 = 值
5、nonlocal的使用 (用到的非常少,理解就行)
nonlocal关键字只能在函数中使用
作用:在局部的局部中修改局部变量的的值
语法:
nonlocal 变量名
变量名 = 值
"""
# 思考?
funtions = []
for xin range(5):
def func1(a):
return a*x
funtions.append(func1)
t1 = funtions[0]
t2 = funtions[2]
print(t1(2),t2(2))
"""
二、函数作为变量
python中,声明函数其实就是声明一个类型是function的变量。函数名就是变量名
函数名作为变量除了可以用来调用函数获取返回值以外,普通变量能做的它都能做。
"""
# 声明类型是int类型的值a
a=10
print(type(a))
# 声明类型是dict类型的变量b
b = {'a':12,'b':200}
print(type(b))
print(b['a'])
# 声明类型是function类型的变量c
c =lambda x: x*x
print(type(c))
c(10)
# 声明类型是function类型的变量d
def d(x):
def e():
print('abc')
e()
return x*x
print(type(d))
d(10)
# 1、让一个变量给另外一个变量赋值
#声明一个列表变量list1
list1 = [1,2,3]
# 使用列表变量list1给list2赋值
list2=list1
print(list2[0])
# 声明一个函数变量func11
def func11():
print("我是函数")
# 使用函数变量func11给ff赋值
ff = func11
# 将ff当成函数来用
ff()
# 2、将变量作为列表的元素或者是字典的值
# 声明列表变量list1
list1 = [1,2,3]
# 将列表变量list1作为列表list2的元素
list2 = [list1,100]
print(list2[0][0])
# 声明一个函数变量func2
def func2():
print("我是函数2")
# 将函数变量func2作为列表list3的元素
list3 = [func2,100]
print(list3[0]())
# 3、作为函数的参数
# 将函数1作为实参,传递给函数2;这儿的函数2就是一个高阶函数(实参高阶函数)
def test(x):
print("text:",x)
if not isinstance(x,int):
x()
# 声明一个int类型的变量a
a =10
# 将变量a作为test的实参
test(a)
def func3():
print("我是函数3")
test(func3)
#3.1 sort函数
"""
def sort(key=None,reverse=False)
key - 确定排序的时候以什么值为标准来排序(默认的情况下,以列表的元素的大小为标准来排序)
需要传一个函数,函数需要一个参数和一个返回值。这的参数是列表的元素
reverse - 是否降序排序,需要穿一个bool值
"""
def yt_sort(list1,key):
if key ==None:
for indexin range(len(list1)):
for index2in range(index+1,len(list1)):
current = list1[index]
behind = list2[index2]
if behind
list1[index],list2[index2] = list2[index2],list1[index]
else:
for indexin range(len(list1)):
for index2in range(index+1,len(list1)):
current = key(list1[index])
behind = key(list2[index2])
if behind
list1[index],list2[index2] = list2[index2],list1[index]
my_list = [1,34,20,89,8]
# yt_sort(my_list)
# my_list.sort()
print(my_list)
my_list2 = [
{'name':'张三','age':18},
{'name':'李四','age':30},
{'name':'王五','age':10}
]
# my_list2.sort() # TypeError: '<' not supported between instances of 'dict' and 'dict'
# yt_sort(my_list2) # TypeError: '<' not supported between instances of 'dict' and 'dict'
def get_age(x):
return x['age']
yt_sort(my_list2, get_age)
print(my_list2)
my_list2 = [
{'name':'张三','age':18,'score':90},
{'name':'李四','age':30,'score':80},
{'name':'王五','age':10,'score':89}
]
# 取最大年龄对应的字典
max_age =max(my_list2,key=lambda x: x['age'])
print(max_age)
# 取最大成绩对应的字典
max_score =max(my_list2,key=lambda x: x['score'])
print(max_score)
# 4.变量作为函数的返回值
# 返回值是函数的函数,也叫高阶函数(返回值高阶函数)
def test2(n):
sum1 =1
for xin range(1, n+1):
sum1 *= x
return sum1
re = test2(5) +10
print(re)
# =================================
def get_operation(char):
# char = '+' (不能使用单行注释)
"""
根据不同的符号返回不同的功能(函数功能的描述)
:paramchar: 运算符符号
:return: 不同运算符对应的功能的函数
"""
if char =='+':
# 求和的功能
def sum(*args, **kwargs):
# args = (10,20,30)
"""求多个数的和"""
sum1 =0
for item1in args:
sum1 += item1
for keyin kwargs:
sum1 += kwargs[key]
print('yt')
return sum1
return sum
elif char =='*':
def mul(*args, **kwargs):
sum1 =1
for item1in args:
sum1 *= item1
for keyin kwargs:
sum1 *= kwargs[key]
return sum1
return mul
elif char =='-':
def diff(*args):
"""求多个数的差"""
# (10, 20, 30)
sum1 = args[0]
for indexin range(1,len(args)):
sum1 -= args[index]
return sum1
return diff
else:
print('暂时不支持这个运算符')
return None
# re是一个函数
re = get_operation('+')
# re(10, 20, 30) - 调用函数获取返回值
print(re(10,20,30))# 60 = 10+20+30
# get_operation('*') - 这个整体是一个函数
# get_operation('*')(1, 2, 3) - 调用求乘积的那个函数,并且获取返回值
re = get_operation('*')(1,2,3)
print(re)
# 10 - 20 - 30
print(get_operation('-')(100,20,30))
"""
四、迭代器
1、什么是迭代器(iter)
迭代器是python中的容器类型数据,同时可以存储多个数据。
取迭代器中的数据只能一个一个取,而且取出来的数据,在迭代器中就不存在
2、迭代器中数据的来源
a.将其他数据类型转换成迭代器
b.使用生成式、生成器取产生数据
3、将数据转换成迭代器
所有的序列都可以转换成迭代器
"""
# 将字符串转换成迭代器
iter1 =iter('abcd')
print(iter1)
iter2 =iter([1,10,100,1000])
print(iter2)
iter3 =iter({'name':'小明','age':20})
print(iter3)
"""
4、获取迭代器中的元素
a.
next(迭代器)/迭代器next() - 取出迭代器中第一个元素(已经去出来的元素再也会不到迭代器中了)
"""
iter1 =iter('abcd')
print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
# print(next(iter1)) # 当迭代器是空的时候,使用next获取元素,会出现StopIteration异常
print(iter2.__next__())
print(next(iter2))
# b.通过for循环取出迭代器中每个元素
for xin iter2:
print('==:', x)
# print(next(iter2)) # 出现异常StopIteration,因为for循环已经将这个迭代器中的元素取完了
"""
四、生成器
1、什么是生成器
迭代器就是生成器;迭代器不一定是生成器
调用带有yield关键字的函数,拿到的结果就是一个生成器。生成器中元素就是yield关键字后面的值。
2、生成器怎么产生数据
只要函数种有yield关键字,调用函数不会再执行函数体获取返回值,而是创建一个生成器。
当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句为止,
并且将yield后面的值作为结果返回;并且保存当前执行的位置。
获取下一个元素的时候,就从上次结束的位置接着往下去执行函数,直到函数结束或者遇到yield为止;
如果遇到yield就将yield后面的值作为结果返回,并且保存当前执行的位置。
如果函数结束了,就出现StopIteration异常。
生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生的数据的个数