函数的定义
使用关键字def定义函数
def myfunc():
print('hello word')
myfunc()

使用关键字def定义函数时,要在小括号后面添加冒号:,函数定义之后,带有缩进的部分都是函数体,这个函数中,函数体就打印个字符串
函数传参
1.按位置传参
当函数的形参有多个时,最简单的方式就是按照参数的位置按顺序传参
def twoparafunc(para1, para2):
print(para1, para2)
twoparafunc('qwer', "asdf")
twoparafunc('asdf', 'qwer')

这个函数有两个形参,当传参的顺序不同时,输出的结果也不一样,所以,按位置传参很依赖参数的顺序。
而且在调用函数时,无法将函数的形参与实参一一对应,可读性不高
2.关键字传参
关键字传参就是在调用函数时,将函数的形参和实参关联
def twoparafunc(para1, para2):
print(para1, para2)
twoparafunc(para1='qwer', para2='asdf')
twoparafunc(para2='asdf', para1='qwer')

使用关键字传参将函数的形参与实参进行匹配,可读性好,而且函数形参的顺序也无关紧要(para1和para2谁在前谁在后都可)
3.默认实参
默认实参就是在函数定义的时候,将函数的形参指定为某个值
def defaultpara(para1, para2='xiaocui'):
print(para1, para2)
defaultpara('haha')
defaultpara(para1='haha')
defaultpara('haha', 'laocui')
defaultpara(para1='haha', para2='laocui')

在defaultpara中,将para2的值指定为'xiaocui',所以,在调用函数defaultpara时,如果不想指定第二个参数,那么就可以省略第二个实参的书写,当然,也可以重新指定实参
注意点
在函数定义的时候,将默认实参放在函数的最后,且默认参数的等号两边不要有空格
def defaultpara2(para1='haha', para2):
print(para1, para2)
defaultpara2('xiaocui')

此时调用defaultpara2时,会报错,提示默认参数后面有一个非默认参数,Python中规定默认参数后面不能跟非默认参数,具体原因见知乎https://www.zhihu.com/question/24981697
所以,在定义函数的时候,先把写出没有默认参数的形参,再写有默认参数的形参,这样就不会报错了
4.传列表和字典
无论上述哪种传参形式,都可以给一个函数传列表或者列表
def twoparafunc(para1, para2):
print(para1, para2)
twoparafunc(para2=[x for x in range(0,10)], para1={'x':5})

当使用列表名字进行传参时,在函数中修改列表,原来的列表也会随之变化,当使用切片传参时,传入的只是列表的副本,修改该副本,不影响原来列表
def twoparafunc(para1, para2):
if isinstance(para1, list)://类型判断
para1[0]=110
else:
print('para1 is not a list')
if isinstance(para2, list):
para2[0]=119
else:
print('para2 is not a list')
print(para1, para2)
l1=list(range(0,10));
l2=[x**2 for x in l1[0::2]]//偶数平方
print(l1,l2)
twoparafunc(para1=l1, para2=l2[:])
print('----------------------')
print(l1,l2)

l1使用列表名字进行传参,l2使用切片进行传参,l1在函数中变化时,l1永久被改变,而l2传的是列表的切片,只是一个副本,与l2无关,所以离开作用域后,l2无变化
具体原因见博客https://blog.youkuaiyun.com/Master_Cui/article/details/105332447中关于列表复制的描述,一般情况下,如果要传列表,请使用列表名进行传参,因为切片需要拷贝,创建副本,影响效率,尤其是大列表
关于类型判断的相关文章见https://blog.51cto.com/alsww/1787848
5.传递任意数量的参数
def anyparas(*paras):
print(paras, type(paras))
anyparas(1,2,3,4,list(range(0,20))[1:19:3], {'x':10}, tuple(range(0,5)))

在Python中,想传递任意数量的参数,可以将参数前面加一个*,这里*paras表示传递任意数量的参数
输出结果最外层使用括号括起来的,说明参数paras是一个元组,而且打印结果也证明了这一点
如果想将一般参数和任意数量的参数结合使用,任意数量的参数一定要放在最后
def anyparas2(para1, para2, *paras):
print(para1, para2)
print(paras)
anyparas2(1,2,3,4,list(range(0,20))[1:19:3], {'x':10}, tuple(range(0,5)))

para1匹配1,para2匹配2,剩下的参数匹配paras
6.将任意数量的关键字参数存储在字典中
如果想将任意关键字参数以 参数名:参数值 的形式存储到字典中,需要在函数参数的名称前中添加**
def parasindict(lname, fname, **info):
print(info)
parasindict('cui','jidan', para1=10, para2=20)
parasindict(lname='cui',fname='jidan', para1=10, para2=20)

上述代码将para1和para2的名称和对应的值以字典的形式存储到info参数中
把lname和rname也以关键字的形式进行传参,不会存储到info中,就说明存储到字典中的关键字参数不能在函数定义中出现,必须得是不重复的参数
函数的返回值
和C++一样,Python也通过return关键字将值返回到函数调用处
def parasindict2(lname, fname, **info):
return info;
print(parasindict2('cui','jidan', para1=10, para2=20))
print(parasindict2(lname='cui',fname='jidan', para1=10, para2=20))

上述代码将字典info返回,并通过print打印
模块与函数
模块就是.py文件,如果想在一个文件中使用另一个文件中的函数,就需要使用将文件(模块)导入到正在编辑的文件中,
1.导入整个模块(文件)
现在有个文件名字叫function.py,想在module.py中使用function.py中的函数,只需要在module.py的开头添加一句import function,这样就会将整个function.py中的内容导入到文件中
比如function.py的内容如下:
def myfunc():
print('hello word')
比如在module.py中使用function.py中的函数,module.py的内容如下
import function
function.myfunc()

当使用了import function后,就可以在module中通过 文件名(模块名).函数名 的方式访问function中的函数(例如function.myfunc())
如果觉得function名字有点长,可以给function模块重命名
import function as f
f.myfunc()
function.myfunc()

效果完全一样,只不过通过as函数给模块重命名一下
2.导入模块(文件)中的某些函数
如果在function.py的文件有两个函数
def myfunc():
print('hello word')
def myfunc2():
print('hello word2')
如果现在只想导入myfunc2,可以通过from function import myfunc2来实现
from function import myfunc2
myfunc2()

现在在module中只导入了myfunc2函数,而且在调用myfunc2时,不用指定模块名
如果想导入某个文件(模块)的所有函数,可以使用from function import *,不过这种方式不建议使用,因为Python的包太多,调用函数时很容易出现歧义错误
参考:
1.《Python编程从入门到实践》
2.https://www.zhihu.com/question/24981697
3.https://blog.51cto.com/alsww/1787848
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
994

被折叠的 条评论
为什么被折叠?



