写点什么

Python|函数和模块

作者:AXYZdong
  • 2022 年 7 月 03 日
  • 本文字数:2721 字

    阅读完需:约 9 分钟

Python|函数和模块

Author:AXYZdong

自动化专业 工科男

有一点思考,有一点想法,有一点理性!

定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!

更多精彩文章前往:👉 个人主页


定义函数:def 关键字。函数名后面的圆括号中可以放置传给函数的参数,函数执行完成后可以通过 return 关键字来返回一个值。

函数的参数

在 python 中,函数的参数<u>可以有默认值</u>,<u>也支持使用可变参数</u>,所以 python 中并不需要其他语言一样支持 <u>函数的重载</u>(因为定义一个函数的时候可以让它有多种不同的使用方式)。


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:AXYZdongDate: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')
'''HelloWorld'''
复制代码


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 内置的那些标识符,inputprintint 等都属于内置作用域。


名称相同的局部变量和全局变量


'''Author:AXYZdongData: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 localone localtwo localglobal
复制代码

global 语句

如果要在一个函数内修改全局变量,就要使用 global 语句。


  • 如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。

  • 如果在一个函数中,有针对该变量的 global 语句,它就是全局变量。

  • 否则,如果该变量用于函数中的赋值语句,它就是局部变量。

  • 但是,如果该变量没有用在赋值语句中,它就是全局变量。


def spam():    global eggs    eggs = 'spam' #this is the global    def bacon():    eggs = 'bacon' #this is a localdef ham():    print(eggs) #this is the global    eggs = 42 #this is the globalspam()print(eggs)
复制代码


参考文献


[1]:https://github.com/jackfrued/Python-100-Days

[2]:Python 编程快速上手:让繁琐工作自动化/ (美)斯维加特(A1 Sweigart) 著;王海鹏译.北京:人民邮电出版社,2016.7

[3]:Python 中文指南;作者:王炳明,版本:v1.0


本次的分享就到这里


如果我的文章对你有帮助、如果你喜欢我的文章内容,请 “点赞” “评论” “收藏” 一键三连哦!

听说 👉 点赞 👈 的人运气不会太差,每一天都会元气满满呦!^ _ ^

码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了👉 关注 👈我哦!

如果以上内容有任何错误或者不准确的地方,欢迎在下面👇留个言。或者你有更好的想法,欢迎一起交流学习~~~


发布于: 刚刚阅读数: 4
用户头像

AXYZdong

关注

没有伞的孩子要学会奔跑! 2020.06.01 加入

自动化专业 工科男 有一点思考,有一点想法,有一点理性。 定个小小目标,努力成为习惯。

评论

发布
暂无评论
Python|函数和模块_7月月更_AXYZdong_InfoQ写作社区