作用域又可以被称为命名空间,指变量起作用的范围。Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域。
(资料图片)
| 作用域 | 英文 |
|---|---|
| 局部作用域 | Local |
| 嵌套作用域 | Enclosing |
| 全局作用域 | Global |
| 内置作用域 | Buiit-in |
内建作用域是特质python api内置的一些操作,例如 len 、max等函数,无需声明就可使用。
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量:定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
- 局部变量:局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
x = 2def func(): x = 3 # 局部变量 return xresult = func()print(result) # 3print(x) # 2当我们在代码里使用变量时,Python创建对象,改变对象或查找对象都是在一个所谓命名空间下进行的(一个保存变量名的地方)。而函数除了打包代码之外,还定义了一个新的变量空间,一个函数所有的变量,都与函数的命名空间相关联:
也就是说:
回到上面的那个例子:
x = 2def func(x): x = 3 """尽管这两个变量名都是x,但是他们作用域(命名空间)可以把他们区别开。作用域(命名空间)有助于防止程序之间变量名的冲突,而且,有助于函数成为更加独立的单元。在Python中,函数定义了一个函数本地内的作用域,而像x = 2这样赋值语句定义了一个全局作用域(模块级别的变量,使用范围仅限于单个文件)。而像x = 3这样赋值语句定义了一个局部作用域(范围仅限于函数内部)。"""函数中修改不了全局作用域的变量如需修改,加global关键字,声明变量为全局变量
y = 10def func(): global y y = 5 print("y1 =", y)func()# y1 = 5print("y2 =", y) # y2 = 5"""函数体中使用了global关键字,声明y为全局变量,故在函数中就改变了y的值若函数体中没有global y 语句,最后的结果就是y1 = 5,y2 = 10 4;这就跟上面的那个案例相同了"""# E(enclosing):嵌套的父级函数的局部作用域def mytest1(): b = 6 # 局部变量 相对而言 我们的b是函数mytest2的全局变量 def mytest2(): # nonlocal b # nonlocal 关键字用于在嵌套函数内部使用变量 了解即可 用的时候比较少 b = 7 # 重新开辟了内存空间 注释掉直接打印b print(b, id(b)) mytest2() print(b, id(b))mytest1()"""7 14403956487 1440395648 """高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
# 频繁的使用 需要其他的功能结合使用def func(): print("定义一个普通函数")def high_level(func): print("定义一个高阶函数") # 此函数的功能 # 在函数内部,通过传入的函数参数调用 func() # 调用我传入的函数名的函数high_level(func)"""定义一个高阶函数定义一个普通函数"""def func(): print("定义一个普通函数")def high_level(func): print("定义一个高阶函数") return func # high_level # return func() 这个是直接返回函数调用,递归函数就是如此res = high_level(func)# 高阶函数返回函数之后在调用func函数res()"""定义一个高阶函数定义一个普通函数"""# 打印1-9(range)def func(start, end, step=1): print(start) if start >= end: return # 结束函数运行,停止递归 func(start + step, end, step)func(1, 9)1)lambda函数
# lambda函数# 当函数里面只有一行代码时,可以转换为匿名函数# 实际中,只使用一次,不需要考虑函数的名字,只需要功能# lambda 传入的参数:返回的数据def add(a, b): return a + bprint(add(1, 2))print((lambda a, b: a + b)(1, 2))add1 = (lambda a, b: a + b) # 定义名字,重复使用print(add1(2, 2))print(add1(2, 3))import random# 无参数sdds = lambda: random.random()sdds()# 一个参数fun1 = lambda x: xprint(fun1("hello python"))# 默认参数 (缺省参数)fun2 = lambda a, b, c=100: a + b + cprint(fun2(10,19,1000))# 可变参数之argsfun3 = lambda *args: argsprint(fun3((1,2,3,4,5)))# 可变参数之kwargsfun4 = lambda **kwargs: kwargsprint(fun4(name="yueyue",age=18,height="178cm"))# 带判断的lambda表达式asd = lambda x: x if (x > 10) else 10print(asd(5))#### 它是以下带有def和return 关键字的普通函数的更简单版本:def fun(x): if x > 10: return x else: return 10print(fun(5))# 列表中的字典排序# 需求:假设我们需要对字典中的年龄进行排序user_list = [ {"name": "zhangsan1", "age": 18}, {"name": "lisi1", "age": 19}, {"name": "wangwu1", "age": 17}]def getAge(element): return element["age"]# 传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序user_list.sort(key=getAge,reverse=True)print(user_list)# 我们需要使用匿名函数,使用sort函数中的key这个参数,来指定字典比大小的方法# reverse参数控制升序与降序排列user_list.sort(key=lambda x:x["age"],reverse=True)print(user_list)2)map函数
# map函数 映射# 列表数据转为字符串list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]print(list(map(lambda i: str(i), list1))) # ["1", "2", "3", "4", "5", "6", "7", "8", "9"]print(list(map(str, list1))) # ["1", "2", "3", "4", "5", "6", "7", "8", "9"]3)reduce函数
from functools import reduce关于模块(module)的知识和使用方法后续会进行深入学习。
from functools import reduce # 导入内置reduce函数def fn(x, y): return x + yres = reduce(fn, [1, 3, 5, 7, 9])print(res)# 254)filter函数
# 在一个list中,删掉偶数,只保留奇数def is_odd(n): return n % 2 == 1print(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))) # [1, 5, 9, 15] 这个建议自行去写一下,除了这个系统,还有图书馆管理系统,宿舍管理系统等,网络上都有许多教程,换汤不换药的,有需要可以联系。
Copyright 2015-2023 港澳创新网版权所有 备案号:京ICP备2023022245号-31 联系邮箱:435 226 40 @qq.com