nonlocal global
global
在局部作用域声明一个全局变量
def func():
global name # 声明name为全局变量
name ="taibai"
func()
print(name)
在局部作用域修改一个全局变量
count=0
def func():
global count # 声明此处的变量count为全局变量
count+=1
func()
print(count)
nonlocal
不能够操作全局变量
内层函数对外层函数的局部变量进行修改
def wrapper():
count=1
def inner():
nonlocal count # 声明此处的变量count为上一层的全局变量
count+=1
print(count) # 1
inner()
print(count) # 2
wrapper()
print(count)
函数名的运用(其实函数名就是一个变量,只不过函数名指向的是函数的内存地址)
函数名+()可以执行函数
函数名就是变量
def wrapper():
count=1
def inner():
nonlocal count # 声明此处的变量count为上一层的全局变量
count+=1
print(count) # 1
inner()
print(count) # 2
f=wrapper
f1=f
f2=f1
f2() # 依然可以执行
f1()
f()
wrapper()
函数名可以作为容器类数据类型的元素
def func1():
print("in func1")
def func2():
print("in func2")
def func3():
print("in func3")
lst=[func1,func2,func3]
for i in l1:
i()
函数名可以作为函数的参数
def func():
print("in func")
def func1(x):
x()
print("in func1")
func1(func) # in func in func1
函数名可以作为函数的返回值
def func():
print("in func")
def func1(x):
print("in func1")
return x
ret=func1(func)
ret()
# in func1
# in func
新特性:格式化输出(f-string)
字符串与变量拼接写法:
# 旧的写法
name="taibai"
age=18
msg1="我叫%s,今年%s"%(name,age)
msg2="我叫{},今年{}".format(name,age)
# f-string
msg3=f"我叫{name},今年{age}"
可以加表达式
dic={"name":"alex","age":"73"}
msg=f"我叫{dic[dic[‘name‘]},今年{dic[‘age‘]}"
# 除了字典,还可以用列表
count=7
print(f"最终结果:{count**2}")
name="taibai"
msg=f"我的名字是{name.upper}"
# 结合函数写
def _sum(a,b):
return a+b
msg=f"最终的结果是:{_sum(10,20)}"
print(msg)
优点:
注意(暂作了解):
迭代器:
可迭代对象
‘__iter__‘
方法的对象,就叫可迭代对象获取对象的所有方法并且以字符串的形式表现:dir
判断一个对象是否是可迭代对象
print(‘__iter__‘ in dir(str1))
小结:
字面意思:可以进行循环更新的一个实实在在的值。
专业角度:内部含有__iter__
方法的对象,就是可迭代对象。
判断一个对象是不是可迭代对象:__iter__ in dir(对象)
目前学过的可迭代对象:str、list、tuple、dict、set、range
优点:
缺点:
占用内存。
不能直接通过for循环,不能直接取直(索引,key除外)
l1=[1,2,3,4]
for i in l1:
print(i)
# 在这里可以使用for循环是因为for循环内部进行了一步转化,转化成了迭代器
迭代器
迭代器的定义
__iter__
方法,并且含有__next__
方法的对象就是迭代器。判断一个对象是否是迭代器
可以判断是否是迭代器:__iter__ and __next__
在不在dir(对象),目前学到的只有文件句柄是一个迭代器,其余的只是可迭代对象
with open(‘文件1‘,mode=‘w‘,encoding=‘utf-8‘) as f:
print(‘__iter__‘ in dir(f) and ‘__next__‘ in dir(f)) # True
s=‘abc‘
print(‘__iter__‘ in dir(s) and ‘__next__‘ in dir(s)) # False
迭代器的取值
利用迭代器进行一个一个取值(个人理解为游标)
# 方式1
print(next(obj))
# 方式2
print(obj.__next__())
可迭代对象如何转化成迭代器
将可迭代对象抓化成迭代器
s1=‘abc‘
# 方式1
obj=iter(s1)
# 方式2
obj=s1.__iter__()
# 底层实现方式一样
print(obj) # <str_iterator object at 0x00000267C342CF70>
while循环模拟for循环机制
l1=[1,2,3,4,5,6,6,7,8,9]
# 将可迭代对象转化为迭代器
obj=iter(l1)
while 1:
try:
print(next(obj))
except StopIteration:
break
小结
__iter__
方法,并且含有__next__
方法的对象就是迭代器。可迭代对象与迭代器的对比
补充
默认参数参数的陷阱
局部作用域的坑
count=0
def func():
print(count)
count=0
此时就会报错(顶以前引用变量),若将第4行进行注释就没有错误,或者将第四行移动到打印语句上方
原文:https://www.cnblogs.com/doubledabo/p/14787343.html