zl程序教程

您现在的位置是:首页 >  Python

当前栏目

「Python」函数和模块

2023-03-20 14:53:56 时间

文章目录

定义函数: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='\')
ac

局部和全局作用域

  • 在被调用和函数内部定义的变量,属于该函数的局部作用域。当一个函数被调用时,就创建了一个局部作用域,该函数返回时,这个局部作用域就会被销毁,它的所有变量都会丢失。
  • 在所有函数之外定义的变量,属于全局作用域。只有一个全局作用域,它是在程序开始的时候创建的。如果程序终止,全局作用域就会被销毁,它的所有变量都会丢失。

一个变量只能是其中一种,不可能既是全局的又是局部的。在不同的作用域中可以用相同的名字命名不同的变量。

  • 局部变量不能在全局作用域内使用
  • 局部作用域不能使用其他局部作用域内的变量
  • 全局变量可以在局部作用域中读取

Python 在查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和”内置作用域“的顺序进行搜索。“内置作用域”就是Python内置的那些标识符,inputprintint 等都属于内置作用域。

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

'''
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)

参考文献

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

  本次的分享就到这里