0%

python学习笔记(2) 函数和模块

  1. 函数及函数参数
    1. 一般函数及参数定义
    2. 两种类型的可变参数
  2. 模块化处理
    1. 书写、导入与使用模块
    2. 避免模块文件中代码的自动执行
  3. 规范化书写格式

函数及函数参数

一般函数及参数定义

1
2
3
4
5
6
7
8
# 定义函数,指定参数及其默认值
def sum(a=0, b=0, c=0):
return a + b + c

# 调用函数
sum(10) # 可不写全
sum(1, 2, 3)
sum(b=2, a=1, c=3) # 自定义顺序

两种类型的可变参数

  1. *
1
2
3
4
5
6
7
# 用*接收任意数量的非关键字参数(元组(),不是数组[])
def func1(*a):
print(a)


func1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
# 输出:(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  1. **
1
2
3
4
5
6
7
# 用**接收关键字参数(对象)
def func2(**b):
print(b)


func2(one=1, two=2, three=3, four=4, five=5)
# 输出:{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
  1. 混合使用
1
2
3
4
5
6
7
8
9
def func3(*a, **b):
print('a = ', a)
print('b = ', b)


func3(1, 2, 3, 4, 5, one=123, two=456, three=789)
# 输出:
# a = (1, 2, 3, 4, 5)
# b = {'one': 123, 'two': 456, 'three': 789}
  1. 打包拆解

在1,2,3的例子中,*** 起着打包的作用,即:将实参中的多个参数打包到一个变量中去

此外,这两个符号还起到拆解的作用,其用法与打包相反,且仅用于函数传参中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def func4(a=0, b=0, c=0, d=0, e=0):
print(a, b, c, d, e)


def func5(one=0, two=0, three=0, four=0, five=0):
print(one, two, three, four, five)


a = (1, 2, 3, 4, 5)
b = [1, 2, 3, 4, 5]
c = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
func4(a) # 输出:(1, 2, 3, 4, 5) 0 0 0 0
func4(b) # 输出:[1, 2, 3, 4, 5] 0 0 0 0
func4(c) # 输出:{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5} 0 0 0 0
func4(*a) # 输出:1 2 3 4 5
func4(*b) # 输出:1 2 3 4 5
func4(*c) # 输出:one two three four five
func5(**c) # 输出:1 2 3 4 5

总结来说,* 把一个数组、元组拆分成一个又一个的数据,把键值对的值提取出来,传入到函数中;** 只对键值对处理,把键值对提取为 key=value 的形式传入函数中。

模块化处理

书写、导入与使用模块

module1.py

1
2
def func():
print('module1')

module2.py

1
2
def func():
print('module2')

main.py

1
2
3
4
5
import module1
import module2 as m2

module1.func()
m2.func()

也可以写成这样:

1
2
3
4
5
from module1 import func as f1
from module2 import func as f2

f1()
f2()

避免模块文件中代码的自动执行

如果 module1.py 中存在可执行代码:

1
2
3
4
5
def func():
print('module1')


print('hello')

main.py 中用 import 导入该模块时,会自动执行模块中除函数定义外的代码

1
import module1  # 输出:hello

避免这个问题的解决方法是:

1
2
3
4
5
6
7
8
def func():
print('module1')


# __name__ 是python的内置变量,代表模块名称
# 当且仅当python的解释器直接执行当前.py文件时,__name__的值为__main__
if __name__ == '__main__':
print('hello')

规范化书写格式

1
2
3
4
5
6
7
def main():
# add your code here
pass


if __name__ == '__main__':
main()

pass 是空语句,不做任何事情,一般用作占位语句,为了保证程序结构的完整性

在vscode中敲一个pass然后换行,可以往前跳一个缩进,可以用来表示当前代码块执行完毕