作用域也叫命名空间,是访问变量时查找变量名的范围空间
作用域 | 英文解释 | 英文简写 |
局部作用域(函数内) | Local(function) | L |
外部嵌套函数作用域 | Enclosing function locals | E |
函数定义所在模块(文件)的作用域 | Globals(module) | G |
python 内置模块的作用域 | Builtin(python) | B |
v = 100
def fun1():
v = 200
print('fun1.v = ', v)
def fun2():
v = 300
print('fun2.v=', v)
fun2()
fun1()
print("全局的v=", v)
作用
1、告诉解释器,,global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域(也称作全局变量)
2、全局声明(global) 将赋值的变量映射到模块文件内部的作用域
语法
global 变量1, 变量2, ...
说明
1、全局变量如果要在函数内部被赋值,则必须经过全局 声明(否则会被认为是局部变量)
2、全局变量在函数内部不经过声明就可以直接访问
3、不能先创建局部变量,再用global声明为全局变量,此做法不附合规则
4、global变量列表里的变量名不能出现在此作用域内形参列表里
示例
v = 100
def fn():
# 添加全局声明,告诉解释执行器,本函数内的变量v为全局变量
global v
v = 200 # 本意想要修改全局变量v让它绑定200
fn()
print("v =", v)
示例
var = 100
def f1():
var = 200
print("f1里的var=", var)
def f2():
nonlocal var # 声明var为f2以外,全局变量以内的变量
var = 300
f2()
print('f1调用结束时var=', var)
f1()
print("全局的var=", var)
图示
globals() 返回当前全局作用域内变量的字典
locals() 返回当前局部作用域内的变量的字典
示例
a = 1
b = 2
c = 3
def fx(c, d):
e = 300
# 此处有几个局部变量?
print('locals() 返回', locals())
print("globals() 返回", globals())
print(c) # 局部c 100
print(globals()['c']) # 全局c 3
fx(100, 200)
lambda 表达式(又称匿名函数)
创建一个匿名函数对象
同 def 类似,但不提供函数名
lambda [形参1, 形参2, ...] : 表达式
1、lambda 只是一个表达式,它用来创建一个函数对象
2、当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用
3、lambda 表达式创建的函数只能包含一条表达式
4、lambda比函数简单且可以随时创建和销毁,有利于减少程序的偶合度
def myadd(x, y):
return x+y
# 可以改写为:
myadd = lambda x,y : x + y
# 理解一下程序
def fx(f, x, y):
print(f(x, y))
fx((lambda a, b: a + b), 100, 200)
fx((lambda a, b: a ** b), 3, 4)
满足下列条件中一个的函数即为高阶函数
a、函数接收一个或多个函数作为参数传入
b、函数返回一个函数
map(func, *iterables)
用函数和对可迭代对象中的每一个元素作为参数返回新的可迭代对象。当最短的一个可迭代对象不再提供数据时迭代结束
要求:func函数接收的参数个数必须与可迭代对象的个数相同
def power2(x):
return x**2
# 生成一个迭代器,此迭代器可以生成1~9的自然数的平方
# 1 4 6 16
mit = map(power2 , range(1, 10))
for x in mit:
print(x)
求 1**2 + 2**2 + 3**2 + ...+ 9**2的和
x = map(lambda x:x**2,range(1,10))
print(sum(x))
求 1**9 + 2**8 + 3**7 + .... + 9**1的和
x = map(lambda x,y:x**y,range(1,10),range(9,0,-1))
print(sum(x))
def isodd(x): # 此函数判断x是否为奇数,如果是奇数返回True
return x % 2 == 1
for x in filter(isodd, range(41, 53)):
print(x)
L = [5, -2, -4, 0, 3, 1]
L2 = sorted(L) # [-4, -2, 0, 1, 3, 5]
# 按绝对值排序
L3 = sorted(L, key=abs) # [0, 1, -2, 3, -4, 5]
names = ['Tom', 'Jerry', 'Spike', 'Tyke']
# 按字符串长度排序 , 结果 ['Tom', 'Tyke', 'Jerry', 'Spike']
L = sorted(names, key=len)
names = ["tom","jerry","spike","tyke"]
# 按字符串排序的依据为原字符串反序的字符串:'moT', 'yrreJ', 'ekipS', 'ekyT'
# 结果: ['Spike', 'Tyke', 'Tom', 'Jerry']
# 方法1
def xx(a):
return a[::-1]
print(sorted(names,key=xx))
# 方法2
print(sorted(names,key=lambda x: x[::-1]))
函数直接或间接的调用自身
回归阶段: 按递归终止条件求出结果,逆向逐步代入递归公式,回归到问题求解
先假设函数已经实现
# 写一个函数求n的阶乘(递归实现)
def myfac(n):
if n == 1:
return 1
return n * myfac(n-1)
print('5的阶乘是:', myfac(5))
示例:
def make_power(y):
def fn(x):
return x ** y
return fn
pow2 = make_power(2)
print('5的平方是:', pow2(5))
pow3 = make_power(3)
print("6的立方是", pow3(6))
pow100 = make_power(100)
print("2的100次方是:", pow100(2))
eval(source, globals=None, locals=None)
把一个字符串当成一个表达式来执行,返回表达式执行后的结果
示例
s = input("请输入表达式:") # 输入100 + 200 * 300
v = eval(s) # 等同于 v = 100 + 200 * 300
print("您输入的表达式经过eval执行后结果为", v)
x = 100
y = 200
a = eval("x + y")
print(a) # 300
local_scope = { "x":5, "y":10}
# a = eval("x+y",globals = None, locals = local_scope) # 错的,非关键字参数
a = eval("x+y",None, local_scope)
print("a=",a) # a = 15
z = 300
a = eval("x*y+z",{"z":3333}, local_scope)
print(a) # 3383
exec(source, globals=None, locals=None)
把一个字符串当成'程序'来执行
示例
x = 100
y = 200
s = '''z=x+y
print('z=', z)
print("hello world!")
'''
exec(s) # 执行 s这个字符串
print(z)
人工智能(python)—— 目录汇总