Python知识点6——函数

函数的定义

使用关键字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

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值