Python学习——局部变量全局变量、函数缺省参数、函数多值参数、私有化

变量

1
2
3
4
5
变量和数据都是保存再内存中的
python中函数的参数传递和返回值都是靠引用传递的
数据保存再内存中的某个位置,变量中存放的时数据再内存中的地址
引用是指变量中记录数据的地址
可以使用id() 函数查看变量中保存数据所在的内存地址

局部变量和全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
局部变量是函数内部定义的变量,只能在函数内部使用
函数执行结束后,局部变量会被系统回收
全局变量是在整个py文件中声明

注:函数在执行时,变量处理过程:
首先会查找函数内部是否存在制定名称的变量,如果有,直接使用 如果没有会查找函数外不是否存在制定名称的全局变量。

如果函数内部存在和全局变量一样名称的局部变量,在函数内部不能直接修改全局变量的值,如果需要修改全局变量的值,需要使用 global关键字进行申明。global会告诉解释器,后面的变量是一个全局变量,这样在赋值是就不会创建局部变量
注:python3 新增 nonlocal 关键字,表示 该变量不是局部变量
如:
a = 1
def run():
global a
a = 2

交换两个变量的值 a b 变量

1
2
3
4
5
6
7
8
9
10
11
12
方法一: 使用第三个中间变量 c 
c = a
a = b
b = c
方法二:通过 "+ -" 操作计算
a = a + b
b = a - b
a = a - b
方法三:python特有
a ,b = b , a # a ,b = (b , a )

# 注:在python列表变量执行 += 操作时实际上是执行列表变量的 extend 方法,不会噶便变量的引用

函数返回值为元组:

如果一个函数的返回类型是元组小括号可以省略

元组类型的返回值也可以用多个变量分别接受,使用多个变量接收结果时,变量个数和元组个数应一致。

如:

1
2
3
4
5
6
7
8
9
def run():
a = 1
b = 2
return a,b
result = run() #result[0] result[1]
# 也可以通过如下方式
gl_a, gl_b = run()
print(gl_a) # 1
print(gl_b) # 2

函数缺省参数

定义函数时可以给某个参数指定一个默认值,有默认值的参数就叫缺省参数

调用函数时如果没传值,则默认为函数内部定义的默认值

注:

带有默认值的缺省参数必须要放在参数列表的末尾

调用函数时如果有多个缺省参数,需要制定参数名,这样解释器才能知道对应关系

如:

1
2
3
4
5
6
7
8
def run(name,gender=True):
text = "男"
if not gender:
text = "女"
print(text)
run("小明")
run("小花",False) # 如果有多个缺省参数需要制定参数名 如 run("小花",gender = False)

函数多值参数

一个函数在不确定个数参数时会用到多值参数

python中有两种多值参数:

  1. 参数名前加一个*可以接收元组
  2. 参数名前增加两个 *可以接收字典。

一般给多值参数命名时,习惯使用以下两个名字

  1. args——存放元组参数,前面有一个
  2. *kwargs——存放字典的参数,前面有两个

args是arguments的缩写,有变量的含义
kw是keyword的缩写,kwards可以记忆键值对参数

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
def run(*args,**kwargs):
print(args) # (1, 2, 3)
print(kwargs) # {'name': 'a', 'age': 12}
run(1,2,3,name="a",age=12)
# 也可以将一个字典或元组作为一个整体传到可变参数中(拆包)、
# 即如果时元组,在变量前加一个* 如果时字典在变量前加两个 *
def run(*args,**kwargs):
print(args)
print(kwargs)
# run(1,2,3,name="a",age=12)
args = (1,2,3)
kw = {"name":"a","age":12}
run(*args,**kw)

私有化

1
2
3
4
5
6
7
xx: 公有变量
_x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
__xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
xx_:单后置下划线,用于避免与Python关键词的冲突

注:通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。

总结

  • 父类中属性名为__名字的,子类不继承,子类不能访问
  • 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
  • _名的变量、函数、类在使用from xxx import * 时都不会被导入

Python学习——局部变量全局变量、函数缺省参数、函数多值参数、私有化
http://yoursite.com/post/6172854e.html/
Author
Chase Wang
Posted on
June 25, 2019
Licensed under