Python编程:从入门到实践 第三章—函数
语法
就还是需要先记一下函数定义的语法:
def Test(num):
num = 12
如上,def func_name(factors): # codes,除了不用声明返回值类型,和定义前加了个def没啥了,也没有什么先声明再定义的操作吧。。
一些基本的函数内容和C没啥区别,比如 默认参数(同样也是必须放最后)、指定值传参(就可以忽略传参时候的顺序)等。。
书上对于 指定值传参也就是
func(参数名 = 值) ,这种传参方式有名词的:关键字实参
传参问题
关于这个函数的传参问题,感觉应该是和C#的值类型和引用类型相似
- 传入一些简单的数据类型,比如字符串,整型等,就是值传递,函数内部只会改变形参的值,对实参没影响。
- 但是对于列表和字典等复杂的数据类型,就改变实参的值了。
暂且先这样浅显的理解吧,深入的话刚搜了一篇文章:
Python传参的问题
传递任意数量的参数
分为两种
- 接收任意数量参数 like:
def make_meal(size, *toppings):
print('The',str(size)+'-inch big pizza was made of:\n')
for topping in toppings:
print(topping)
“这个 *toppings 中的*号是让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中”
- 接收任意数量的 关键字实参(见前边备注。。)
def get_multifac(num: int, **user):
info = {}
info['number'] = num
for key, value in user.items():
info[key] = value
return info
# 调用
user_infor = get_multifac(3, mission='getup', class='Math')
“这个 **users 中的**号是让Python创建一个名为users的空字典,并将收到的所有 键-值对 都封装到这个元组中”
第一次写这个调用的时候,发现 调用时候:
get_multifac(3, mission=‘getup’, course=‘Math’) 的
mission和course总是报错,我一度以为我这个版本的python不支持这样调用呢。
搜了报错信息才发现:原来是之前函数体内的
for key, value in user 出错了, user既然是个字典,而且这个for循环是用了 key和value的,那应该是 user.items()啊,还是对遍历字典不够熟练导致的错误。。
我记得上一章书上有写 直接 for … in 字典名 是指的键,但这样写显然不如写为 for… in 字典名.keys() 更加明了。
由于这两种函数都是接收不确定数量的实参的,所以说 *factor 和 **factor 都得放到形参列表的最后一个。
函数存储在模块中
模块也就是.py的代码文件了,然后在模块里写的函数,可以再其他代码中import
比如我现在创建了一个PizzaMake.py 文件,代码为:
def prepare_work():
print("preparing")
def make_pizza():
print("making")
def finish():
print("finish!")
有几种方式
- 直接引用整个模块
import PizzaMake
这种引用方式,调用函数时需要加上模块名,也就是
模块名.函数名的形式调用 - 引用模块中的某些函数
from PizzaMake import prepare_work, make_pizza, finish
这种就不用加模块名直接调用函数就可以 - 引用模块的所有函数
form PizzaMake import *
这种方式不推荐,因为把一个模块中的所有函数都import,却不知道具体的函数名,很容易与当前代码中的其他函数名冲突,从而引起覆盖。
无论是import 模块还是模块中的函数都可以重命名的:
import PizzaMake as p
from PizzaMake import make_pizza as mp, prepare_work as pw