python基础--函数进阶

1. 全局变量和局部变量

  • 局部变量:
定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
局部变量只能在函数内部使用
局部变量在函数调用时被自动创建
  • 全局变量:
定义在函数外部的变量称为全局变量
全局变量,所有函数都可以直接访问,但函数内不能将其直接改变
# 局部变量和全局变量创建和销毁实例:
def myadd(x, y):
    m = x + y
    return m

x = 100
y = 200
z = myadd(x, y)
print(x, y, z)
a = 10
b = 20
z = myadd(a, b)
print(x, y, z)
100 200 300
100 200 30

2. 函数的嵌套:

函数嵌套是指在一个函数里用def语句来创建其他函数的情况

# 函数内部创建函数,并将其返回
def fn_outter():
    print("fn_outter被调用")

    def fn_inner():
        print("fn_inner被调用")

    fn_inner()  # 可以调用内部的fn_inner函数


fn_outter()
fn_inner()  # 调用是错误的,因为没有fn_inner这个变量名
fn_outter被调用
fn_inner被调用



---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-4-80b60bddee2e> in <module>
     10 
     11 fn_outter()
---> 12 fn_inner()  # 调用是错误的,因为没有fn_inner这个变量名


NameError: name 'fn_inner' is not defined
def fn_outter():
    print("fn_outter被调用")

    def fn_inner():
        print("fn_inner被调用")

    return fn_inner


f = fn_outter()   # f绑定fn_inner这个函数
f()   # 调用
fn_outter被调用
fn_inner被调用
n = 100  # 全局变量

def f(a1, b):
    print(a1, b)
    n = 200  # 此函数内a, b, n 都为局部变量,只在函数调用时起作用(函数的形参也是局部变量)
    print(n)
    m = 300

f(100, 200)
print(n)
print(a1)  # 错的
print(m)  # 也是错的
100 200
200
100



---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-10-95d18be325ac> in <module>
      9 f(100, 200)
     10 print(n)
---> 11 print(a1)  # 错的
     12 print(m)  # 也是错的


NameError: name 'a1' is not defined

3. python 的作用域:

作用域也叫名字空间,是访问变量时查找变量的范围空间

  • Python的四个作用域 LEGB
局部作用域  Local function
外部嵌套函数作用域  Enclosing function local
全局作用域(文件作用域)  Global(Module)
Python内置模块作用域     Builtin(Python)
  • 变量名查找的规则是:
局部变量 --> 外部嵌套函数变量 --> 全局作用域 --> 内置模块作用域
v = 100
def f1():
    v = 200
    print("f1内的V = ", v)


def f2():
    v = 300
    print("f2内的V = ", v)


f1()
f2()
print("全局的V = ", v)
f1内的V =  200
f2内的V =  300
全局的V =  100
  • global 语句
1、告诉解释器,global语句声明的一个后多个变量,这些变量的作用域为模块级的作用域,也称为全局作用域
2、全局声明global将赋值变量映射到模块文件内部的作用

语法:global 变量1, 变量2,......
v = 100
def f1():
    global v  # 声明v为全局作用域的v
    v = 200   # 想要此语句对全局变量v进行修改


print(v)    # 100
f1()   # 调用
print(v)    # 200
100
200
3、全局变量如果要在函数内部改变绑定关系,则必须经过全局声明,否则会被认为是局部变量
4、全局变量在函数内部不经过声明就可以访问,不可改变
5、不能先声明局部变量,再用global声明为全局变量(此做发不符合规则)
6、global变量的列表里的变量名不能出现在此作用域的形参列表里
v = 100
def f1():
    v = 200
    global v
  File "<ipython-input-15-327fd9ccebc6>", line 7
SyntaxError: name 'v' is assigned to before global declaration
s = "ABC"
string = "hello"

def f1(string):
    global s
    s += string

print(s)  # 访问不等于可以改变
f1(string)
print(s)

global s
  File "<ipython-input-48-eab7406b633e>", line 15
SyntaxError: name 's' is used prior to global declaration
  • nonlocal 语句

告诉解释器,声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

语法:nonlocal 变量1, 变量2,.....

1、nonlocal只能在被嵌套函数内部进行使用
2、当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作
3、nonlocal语句的变量列表中的变量名,不能出现在此函数的参数列表里
v = 100

def f1():
    v1 = 200
    def f2():
        global v
        v = 300  # 此时修改全局的v

        nonlocal v1
        v1 = 400  # 此时修改外部嵌套函数的作用域中的v
        print("f2的v值:", v1)
    f2()
    print("f1的v值:", v)

print("全局的v:", v)
f1()
print("全局的v:", v)
全局的v: 100
f2的v值: 400
f1的v值: 300
全局的v: 300

4. lambda 表达式

创建一个匿名函数对象,同def类似,但不提供函数名

语法:lambda [形参名1, 形参2, ...]: 只有一条表达式(语句也不能用)
def myadd(x, y):
    return x + y

myadd1 = lambda x, y : x + y
print("20+30 = ", myadd(20, 30))
print("3.1+4.2 = ", myadd1(3.1, 4.2))
20+30 =  50
3.1+4.2 =  7.300000000000001
1、lambda只是一个表达式,它用来创建一个函数对象,当lambda表达式执行时,返回的是冒号后表达式的值
2、lambda表达式创建的函数只能包含一条表达式
3、lambda比函数简单且可以随时创建和销毁,有利于减少程序的耦合度

练习:写一个lambda表达式,传入两个数x, y, 返回x的平方对y求余的值

mymod = lambda.....
print(mymod(4,5))
# 跟函数调用是一样的
x = int(input("请输入x:"))
y = int(input("请输入y:"))
z = lambda x, y: x**2 % y
print(z(x, y))
请输入x:2
请输入y:3
1

5. 内置函数(7)

  • globals()
返回当前全局作用域内变量的字典
  • locals()
返回当前局部作用域内变量的字典
a = 1
b = 2
c = 3

def fn(c, d):
    e = 300
    print("locals返回:", locals())
    print("globals返回:", globals())
    print("全局的c:", globals()['c'])
    print("局部的c:", locals()['c'])

fn(100, 200)
  • eval() 函数
作用:把一个字符串当成一个表达式来执行,返回表达式执行后的结果
格式:eval(source, globals = None, local = None)
x = 100
y = 200
s = "x+y"   # s为字符串
v = eval(s)   # 把s绑定的字符串当成程序语句来执行
print(v)

gs = {"x":10, "y":20}
v = eval("x+y", gs)
print(v)

ls = {"x":1, "y":2}
v = eval("x+y", gs, ls)
print(v)

ls = {"x":1000}
v = eval("x+y", gs, ls)
print(v)
300
30
3
1020
  • exec() 函数
作用:把一个字符串当成程序来执行
格式:exec(source, globals = None, local = None)
x = 100
y = 200
s = "z = x + y; print('hello', x, y, z)"
exec(s)

# 以上两句等同于此句的作用
z = x + y
print("hello", x, y, z)
hello 100 200 300
hello 100 200 300

注:globals参数和locals参数作用相同,用来设置执行的作用域

同名公众号:庄AC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值