使用模块中的函数
模块是 Python 程序架构的一个核心概念
- 模块就好比是工具包,要想使用这个工具包中的工具,就需要导入 import这个模块
- 每一个以扩展名py结尾的Python源代码文件 都是一个 模块
- 在模块中定义的全局变量、函数都是模块能够提供给外界直接使用的工具
- 可以 在一个 Python 文件 中 定义 变量 或者 函数
- 然后在 另外一个文件中 使用 import 导入这个模块
- 导入之后,就可以使用模块名.变量 / 模块名.函数 的方式,使用这个模块中定义的变量或者函数
变量
- 局部变量:是在函数内部 定义的变量,只能在函数内部使用
- 全局变量:是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量
局部变量
- 局部变量:是在函数内部定义的变量,只能在函数内部使用
- 函数执行结束后,函数内部的局部变量,会被系统回收
- 不同的函数,可以定义相同的名字的局部变量,但是彼此之间不会产生影响
代码示例:
def demo1():
num = 10
print(num)
num = 20
print("修改后 %d" % num)
def demo2():
num = 100
print(num)
demo1()
demo2()
print('over')
10
修改后 20
100
over
全局变量
# 定义一个全局变量
num = 10
def demo1():
print(num)
def demo2():
print(num)
demo1()
demo2()
10
10
函数执行时,需要处理变量时会:
- 首先 查找 函数内部 是否存在 指定名称 的局部变量,如果有,直接使用
- 如果没有,查找 函数外部 是否存在 指定名称 的全局变量,如果有,直接使用
- 如果还没有,程序报错
修改全局变量
global 声明变量是全局变量
num = 10
def demo1():
# global 关键字,告诉 Python 解释器 num 是一个全局变量
global num
# 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
num = 100
print(num)
def demo2():
print(num)
demo1()
demo2()
#结果
100
100
返回值作为参数传递
def test1():
return 50
def test2(num):
print(num)
i = test1()
test2(i)
# 结果
50
函数参数
位置参数
调用函数时根据函数定义的参数位置传递函数
实参和形参的顺序和个数必须一致
def output(name,age,wight):
print(f'姓名:{name},年龄:{age},体重:{wight}')
output('tom',20,70)
# 结果根据参数位置依次把数据输入到函数中
姓名:tom,年龄:20,体重:70
关键字参数
函数调用通过‘键=值’来加以制定,可以让函数更加清晰、容易使用、同时也清楚了参数得顺序需求
注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
def output(name,age,wight):
print(f'姓名:{name},年龄:{age},体重:{wight}')
output('tom',age=20,wight =73)
姓名:tom,年龄:20,体重:73
缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数得值
注意:所有参数必须出现在默认参数前,包括函数定义和调用
def output(name,age,wight,grander='男'):
print(f'姓名:{name},年龄:{age},体重:{wight},性别:{grander}')
output('tom',20,68)
# 结果
姓名:tom,年龄:20,体重:68,性别:男
不定长参数
不定长参数也叫可变参数,用于不确定调用得时候会传递多少个参数(不传递也可以)得场景。此时,可用包裹(packing)位置参数,或者包裹(packing)关键字参数,来进行参数传递,回显得非常方便。
- 包裹位置参数
注意:传进得所有参数都会被args变量收集,他会根据传进得参数得位置合并为一个元组,args是元组类型,这就是包裹位置传递。
def user(*args):
print(args)
user('tom',20,65)
# 结果
('tom', 20, 65)
- 包裹关键字传递
返回一个字典
def user1(**kwargs):
print(kwargs)
user1(name='tom',age=20,wight=65,grander='女')
#结果
{'name': 'tom', 'age': 20, 'wight': 65, 'grander': '女'}
拆包
- 元组拆包
def test1():
return 100,200
num1,num2=test1()
print(num1,num2) #100 200
- 字典拆包
dict1 ={'name': 'tom', 'age': 20, 'wight': 65}
a,b,c=dict1
print(a,b,c)
print(dict1[a],dict1[b],dict1[c])
#结果
name age wight
tom 20 65
补充
交换变量:
- 有两个整数变量 a = 6 , b = 100
- 不使用其他变量,交换两个变量的值
# 变量交换
a = 60
b = 100
#传统方法
a = a+b
b =a-b
a =a-b
print(a,b)
# 变量交换
a = 60
b = 100
# python 方法
a,b =b,a
print(a,b)
变量的引用
- 变量和数据都是保存在内存中的在
- Python 中函数的参数传递以及返回值都是靠引用传递的
引用的概念
在Python中
- 变量 和 数据 是分开存储的
- 数据保存在内存中的一个位置
- 变量 中保存着数据在内存中的地址
- 变量中 记录数据的地址,就叫做引用
- 使用 id() 函数可以查看变量中保存数据所在的内存地址
定义一个整数变量 a ,并且赋值为 1
将变量 a 赋值为 2
定义一个整数变量 b ,并且将变量 a 的值赋值给 b
变量 b 是第 2 个贴在数字 2 上的标签
变量的数据类型
不可变类型,内存中的数据不允许被修改:
数字类型 int , bool , float , complex , long(2.x)
字符串 str
元组 tuple
可变类型,内存中的数据可以被修改:
列表 list
字典 dict
集合 set