昨天是PMP的第一堂课,加之晚上去跑步运动了,导致回来后时间紧张过了00:00还没发出文章,所以干脆加上今天的内容一起发,这两天主要学习了函数的一些常规操作和函数的五种参数定义和调用。
函数常规操作
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#查看帮助信息的函数,help()可以用来查看函数代码
print(help(abs))
#函数名可以赋值给其他变量,相当于给函数取别名
print(abs(-100))
a=abs
print(a(-100))
#使用def语句定义函数,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
defm_pf(x):
returnx*x
print(m_pf(3))
#引入函数的语法'from文件名(不带.py) import函数名'
#pass语句表示什么都不做,可以定义空函数
defnop():
pass
#用isinstance()判断函数传入的参数类型是否正确
defnop(x):
if notisinstance(x,(int,float)):
raiseTypeError('传入参数错误,请传递int或float')
else:
n=x*x
print(n)
#函数可以返回多个值,结果是一个tuple
defsz(x,y,z):
m=x+y+z
n=x*y*z
returnm,n
print(sz(2,3,4))
函数的参数定义和调用
函数的参数类型有五种:位置参数、默认参数、可变参数、关键字参数、命名关键字参数,具体如下:
位置参数(固定参数)
#位置参数必须在其他类型参数前面,按顺序传递值,以下a\b\c都是位置参数
defx(a,b,c):
print('a为:',a,';b为:',b,';c为:',c)
print(x(1,2,3))
默认参数
#默认参数紧跟着位置参数之后,表现形式为参数后面用等号给默认值,以下b=2是默认参数
defy(a,b=2,c=3):
print('a为:', a,';b为:', b,';c为:',c)
#默认参数调用时代码可以不传参,程序默认参数为定义的默认值
print(y(1))
#也可以不按照顺序调用默认参数,但是传参时要写上参数名字
print(y(1,c=3))
#默认参数必须指向不变对象,原因参考下面例子:
#假设默认参数的值是一个list(可变对象)
defb(l=['1','2','3']):
l.append('end')
returnl
#第一次调用时正常增加了end
print(b())
#第二次调用时,增加end是在第一次的结果上,也就是说默认参数的默认值也变了
#默认参数的名字也是一个变量,如果函数中改变了该变量的值,那么默认参数的值也跟着变了
print(b())
#上面这种情况可以将l先指向一个空值None(不变对象),然后再给l赋值成list来解决
defb(l=None):
iflis None:
l=['1','2','3']
l.append('end')
returnl
print(b())
print(b())
可变参数
#可变参数用*表示,可变参数可以传入任意个参数,以下*c为可变参数
defz(a,b=2,*c):
print('a为:', a,';b为:', b,';c为:', c)
#调用带可变参数的函数时,如果有默认参数,则默认参数必须传参,否则会将可变参数按顺序传给默认参数
print(z(1,3,4,5))
print(z(1,'二',3,4,5))
#如果已有一个list或tuple,要将其元素当作函数的参数依次传入,可以直接在list或tuple名前加*
i=['一','二','三']
print(z(*i))
print(z(1,*i))
print(z(1,2,*i))
#但是如果list或tuple的元素小于固定位置参数的数量时,函数仍然会报错,因此固定参数最好判断一下
defw(a,b,c,d=4,*e):
print('a为:', a,';b为:', b,';c为:', c,';d为:', d,';e为:', e)
i=['一','二','三']#去掉‘三’可验证错误
print(w(*i))
关键字参数
#关键字参数同可变参数一样,可传入多个元素,但传入的是dict,即传入参数带有参数名,关键字参数用**表示
defk(a,b=2,*c,**d):
print('a为:', a,';b为:', b,';c为:', c,';d为:', d)
print(k(1,2,3,4,5,d1=6,d2=7,d3=8))
#关键字参数相对于可变参数的好处是可以随意提供像提供的信息,且函数接收到之后也知道该信息的意思
#关键字参数的传入是dict,也可以在dict前增加**直接将dict的值传入关键字参数
j={'d1':7,'d2':8,'d3':9}
#关键字参数传入的是dict,并不适用于第一个参数,因此第一个固定参数不传入时会报错
print(k(1,**j))
命名关键字参数
'''可变参数允许用户提供多个信息,但是这些信息并不知道是什么意思;
关键字参数要求提供信息时,同时提供这些信息的名字,但是用户可能提供一些我们并不关注的信息;
因此演变出命名关键字参数,由我们定义出固定名字的关键字参数,用户可以选择性按需提供'''
#使用*,作为分隔,可以在*,后面定义指定的关键字名称
defm(a,b=2,*,d1,d2,d3):
print('a为:', a,';b为:', b,';d为:', d1,d2,d3)
print(m(1,d1='七',d2='八',d3='九'))
#如果函数的参数中,已经有了一个可变参数,那么后面的命名关键字参数可以不需要*,
defn(a,b=2,*c,d1,d2,d3):
print('a为:', a,';b为:', b,';c为:', c,';d为:', d1,d2,d3)
print(n(1,2,3,4,5,d1='七',d2='八',d3='九'))
#命名关键字参数可以给默认值,如果有默认值那么调用时可以不传参
defh(a,b=2,*c,d1,d2,d3='十'):
print('a为:', a,';b为:', b,';c为:', c,';d为:', d1,d2,d3)
print(h(1,2,3,4,5,d1='七',d2='八'))
由于*list和**dict的方式可以将list或dict当作参数传入函数,因此任何函数都可以通过类似func(*args,**kw)的形式调用
*list将list的元素一个个按位置传入函数,**dict通过key对应参数名传入关键字参数的值
'''练习
定义一个可接收一个或多个数并计算乘积的函数'''
defo(*c):
if notisinstance(c, (int,float,list,tuple)):#此处判断没法判断出list里面是否都是数字
raiseTypeError('传入参数错误,请传递int或float')
else:
i=1
forninc:
i=n*i
returni
print(o(2,3,4,5,6))
print(o(2,3,'错误'))#测试一下发现数字乘以字符串是把字符串重复打出来~~~
领取专属 10元无门槛券
私享最新 技术干货