【Python】函数和模块
定义函数:def
关键字。函数名后面的圆括号中可以放置传给函数的参数,函数执行完成后可以通过 return
关键字来返回一个值。
函数的参数
在python中,函数的参数可以有默认值,也支持使用可变参数,所以python中并不需要其他语言一样支持 函数的重载(因为定义一个函数的时候可以让它有多种不同的使用方式)。
from random import randint
def roll_dice(n=2):
"""摇色子"""
total = 0
for _ in range(n):
total += randint(1, 6)
return total
def add(a=0, b=0, c=0):
"""三个数相加"""
return a + b + c
# 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))
在不确定参数个数时,可以使用可变参数
# 在参数名前面的*表示args是一个可变参数
def add(*args):
total = 0
for val in args:
total += val
return total
# 在调用add函数时可以传入0个或多个参数
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))
用模块管理函数
Python中每个文件就代表了一个模块(module),在不同的模块中可以有同名的函数,在使用函数的时候我们通过 import
关键字导入指定的模块就可以区分到底要使用哪个模块的函数。
import 语句包含一下部分:
import
关键字- 模块的名称
- 可选的更多模块名称,之间用逗号隔开
说明:如果导入的模块除了定义函数之外还有可执行的代码,那么python解释器在导入这个模块时就会执行这些代码。
最好将这些执行代码放入如下所示的条件中,这样除非直接运行该模块,if 条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是 “__ main__”。
module.py
def foo():
pass
def bar():
pass
# __name__是Python中一个隐含的变量它代表了模块的名字
# 只有被Python解释器直接执行的模块的名字才是__main__
if __name__ == '__main__':
print('call foo()')
foo()
print('call bar()')
bar()
test.py
import module
# 导入module时 不会执行模块中if条件成立时的代码 因为模块的名字是module而不是__main__
例:实现计算求最大公约数和最小公倍数的函数
'''
实现计算求最大公约数和最小公倍数的函数
Author:AXYZdong
Date:2021-10-18
'''
def gcd(x,y):
if x > y:
x,y = y,x #找出两个数中的最小的数
for factor in range(x,0,-1): #从最小的数开始遍历,找出最大公约数
if x%factor == 0 and y%factor == 0:
return factor
def lcm(x,y):
return (x*y//gcd(x,y)) #两个自然数的积等于这两个数最大公因数,乘以它们的最小公倍数
None 值
None(首字母N必须大写)表示没有值,是 NoneType 数据类型的唯一值。
如果希望变量中存储的东西不会与一个真正的值混淆,这个没有的值就可能有用。
对于没有 return 语句的函数定义,Python 都会在末尾加上 return None 。 print() 的返回值就是 None 。
关键字参数和 print()
关键字参数是由函数调用时加在它们前面的关键字来识别的。关键字参数通常用于可选变元。
print() 函数有可选变元 end 和 sep ,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开它们。
print() 函数不加可选变元 end 就默认在字符串末尾添加换行符,但在设置 end 关键字参数后,就可以将它变成一个字符串。
print('Hello')
print('World')
'''
Hello
World
'''
print('Hello',end='')
print('World')
'''
HelloWorld
'''
print() 函数打印多个字符串值时,默认用空格隔开它们。但设置 sep 关键字参数,就可以替换掉默认的参数。
>>> print('a','b','c')
a b c
>>> print('a','b','c',sep=',')
a,b,c
>>> print('a','b','c',sep='|')
a|b|c
>>> print('a','b','c',sep='\\')
a\b\c
局部和全局作用域
-
在被调用和函数内部定义的变量,属于该函数的局部作用域。当一个函数被调用时,就创建了一个局部作用域,该函数返回时,这个局部作用域就会被销毁,它的所有变量都会丢失。
-
在所有函数之外定义的变量,属于全局作用域。只有一个全局作用域,它是在程序开始的时候创建的。如果程序终止,全局作用域就会被销毁,它的所有变量都会丢失。
一个变量只能是其中一种,不可能既是全局的又是局部的。在不同的作用域中可以用相同的名字命名不同的变量。
- 局部变量不能在全局作用域内使用
- 局部作用域不能使用其他局部作用域内的变量
- 全局变量可以在局部作用域中读取
Python 在查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和”内置作用域“的顺序进行搜索。“内置作用域”就是Python内置的那些标识符,input
、print
、int
等都属于内置作用域。
名称相同的局部变量和全局变量
'''
Author:AXYZdong
Data:2021-10-21
'''
def one():
a = 'one local'
print(a)
def two():
a = 'two local'
print(a)
one()
print(a)
a = 'global'
two()
print(a)
运行结果
two local
one local
two local
global
global 语句
如果要在一个函数内修改全局变量,就要使用 global 语句。
- 如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
- 如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。
- 否则,如果该变量用于函数中的赋值语句,它就是局部变量。
- 但是,如果该变量没有用在赋值语句中,它就是全局变量。
def spam():
global eggs
eggs = 'spam' #this is the global
def bacon():
eggs = 'bacon' #this is a local
def ham():
print(eggs) #this is the global
eggs = 42 #this is the global
spam()
print(eggs)
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “收藏” “关注”
一键三连哦!
如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言。或者你有更好的想法,欢迎一起交流学习~~~
- 点赞
- 收藏
- 关注作者
评论(0)