该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Python中的nonlocal关键字的使用,lambda表达式,什么是递归,字符串操作方法
总的来说:
golbal 全局变量 nonlocal 代表(翻译 不是本地) 我不是局部 我不是全局
lambda 就是一个表达式
匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下实例:
实例(Python 3.0+)#!/usr/bin/python3 # 可写函数说明 sum = lambda arg1, arg2: arg1 + arg2 # 调用sum函数 print ("相加后的值为 : ", sum( 10, 20 )) print ("相加后的值为 : ", sum( 20, 20 ))
以上实例输出结果:
相加后的值为 : 30相加后的值为 : 40
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
实例(Python 3.0+)#!/usr/bin/python3 total = 0 # 这是一个全局变量 # 可写函数说明 def sum( arg1, arg2 ): #返回2个参数的和." total = arg1 + arg2 # total在这里是局部变量. print ("函数内是局部变量 : ", total) return total #调用sum函数 sum( 10, 20 ) print ("函数外是全局变量 : ", total)
以上实例输出结果:
函数内是局部变量 : 30函数外是全局变量 : 0global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
以下实例修改全局变量 num:
实例
(Python 3.0+)#!/usr/bin/python3 num = 1 def fun1(): global num # 需要使用 global 关键字声明 print(num) num = 123 print(num) fun1() print(num)
以上实例输出结果:
1123123
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:
实例
(Python 3.0+)#!/usr/bin/python3 def outer(): num = 10 def inner(): nonlocal num # nonlocal关键字声明 num = 100 print(num) inner() print(num) outer()
以上实例输出结果:
100100
另外有一种特殊情况,假设下面这段代码被运行:
实例
(Python 3.0+)#!/usr/bin/python3 a = 10 def test(): a = a + 1 print(a) test()
以上程序执行,报错信息如下:
Traceback (most recent call last): File "test.py", line 7, in test() File "test.py", line 5, in test a = a + 1UnboundLocalError: local variable 'a' referenced before assignment
错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。
修改 a 为全局变量,通过函数参数传递,可以正常执行输出结果为:
实例
(Python 3.0+)#!/usr/bin/python3 a = 10 def test(a): a = a + 1 print(a) test(a)
执行输出结果为:
11