1、函数
实现某个功能的一些代码,函数需要调用才可以执行
2、python中函数定义:
def hhh(): #关键字def,后面是函数名,函数名不能重复
print('这是一个函数') #函数体
3、定义函数的形式
##无参函数:
def calc():
print('calc')
calc()
##有参函数:
def calc(x,y):
print(x,y)
calc(1,2)
##空函数:
def calc():
pass
4、函数的参数
#函数在调用时候,可以传入的参数有形参和实参
#形参:变量名;调用时分配内存单元,调用结束,即释放,只在函数内有效,函数接收的参数
#实参:传入的值,可以是常量、变量、表达式、函数等。调用函数时,将实参值传递给形参,调用结束后失效
def calc(a,b):#形参,形式参数
print(a,b)
return a+b #返回值
result = calc(1,2) #调用上面定义的函数,1,2是实参,实际参数
5、函数参数的类型
#位置参数:左到右的顺序依次定义,上面的calc函数,a,b就是位置参数,位置参数必须被传值,有几个必须传入几个值,多一少一都不行,报错
#关键字参数:按照key=value为形参传值,可以打乱顺序,关键字参数必须放在位置参数后面,不能对一个形参多次重复赋值
result2 = calc(a=1,b=2) #调用上面定义的函数,关键字传参
#默认参数:定义形参阶段,就已为该形参赋值,调用时不用在传值,默认参数不是必填的,默认参数必须放在位置形参的后面
def conn_mysql(user,passwd,port=3306):#定义一个连接mysql的方法,port就是一个默认值参数
print(user,passwd,port)
conn_mysql('root','123456')#没指定默认值
conn_mysql('root','123456',port=3307)#指定默认值参数的值
#可变参数:*来接收,传入的实参值个数不固定,想传多少就传多少,如果位置参数、默认值参数、可变参数一起使用的的话,可变参数必须在位置参数和默认值参数后面。可变参数也是非必传的。
def more_arg(name, age, sex='nan', *agrs): # 位置参数、默认值参数、可变参数,可变参数会把后面多传的参数保存成元组的形式,然后赋值给*后的变量名agrs
# 当然args名字是随便写的,不过一般我们都写args
print(name, age, agrs)
more_arg('cathy', 18, 'nv', 'python', 'China') # 调用
#关键字参数:**来接收,后面的参数也是不固定的,关键字参数必须在最后面,非必传
def kw_arg(name,**kwargs):#位置参数、关键字参数,调用的时候会把传入的关键字参数放到kwargs这个字典中,kwargs={'sex':'女','age':18}
print(name,kwargs)
kw_arg('cathy',sex='女',age=18)#调用,sex和age就是关键字调用
6、函数返回
#每个函数都有返回值,如果没有返回值,默认返回None,返回值用return a 或retrun a,b,c,d表示。可以返回一个值或多个值,返回多个值时会把返回值放到一个元组中,
#函数遇到return即结束。
def calc(a,b):#定义有返回的函数
print(a,b)
return a+b #返回值
res = calc(1,2) #把函数返回的结果赋值给res
7、全局变量和局部变量
#函数内调用,为局部变量,出了变量作作用域即失效。
#全局变量,整个程序都可以使用,如果修改全局变量的话需要加global关键声明,如果是list,dict,set不用加,直接修改
8、高阶函数
#函数接收另一个函数作为参数
def f(a,b):
return a+b
def avg(x,y,z):
avg=(x+y+z)/3
return avg
print(avg(f(1,2),3,4))
9、匿名函数
f = lambda a,b,c:a+b+c
print(f(1,2,3))
#f = lambda a,b,c:a+b+c 中的关键字lambda表示匿名函数,
# 冒号:之前的a,b,c表示它们是这个函数的参数。
# 匿名函数不需要return来返回值,表达式本身结果就是返回值。
(lambda x,y: x if x> y else y)(101,102) -->102
10、内置函数
reduce(function,sequence,starting_value) 迭代
说明:
对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用。
function接收的参数个数只能为2,首先把sequence中前两个元素传给函数参数,函数加工后,然后把得到的结果和第三个元素作为两个参数传给函数参数,以此类推
返回一个结果
入参是为函数和列表/元组/字符串和初始值,返回值为数值
实例:
def add(x,y):
return x+y
from functools import reduce
reduce(add,[1,2,3,4])
#-->10,相当于1 + 2 + 3 + 4 = 10
print(reduce(lambda x,y : x*10 + y,[1,2,3,4,5])) #12345
filter(function,sequence)过滤序列
说明:
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,
最后将返回 True 的元素组成一个List/String/Tuple(取决于sequence的类型)。
入参为函数和列表/元组/字符串,返回值为item列表/元组/字符串
实例:
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist) #[1,3,5,7,9]
print (filter(lambda x:x*x-4,range(10))) #(入参是列表字符元组)[0, 1, 3, 4, 5, 6, 7, 8, 9]
map函数:map(function, sequence)
说明:
需要两个参数,一个是函数名,一个是序列,把序列中的每一个元素作为参数,传给函数处理
将执行结果function(item)组成一个List返回
入参是为函数和列表/元组/字符串,返回值为function(item)列表
实例:
def f(x):
return x**2
ret = list(map(f,(1,2,3,4))) #[1, 4, 9, 16]
print (ret)
print (map(lambda x,y:x*y-4,range(3),[8,9,10])) #[-4, 5, 16],入参为列表,有多少个列表,就应该有多少个入参
练习
-0.23
1、判断是否只有一个小数点
2、小数点左边的是一个整数,小数点右边的也是一个整数
3.小数点右边的也是一个整数,左边要以负号开头,只有一个负号,负号后面是整数
def num_float(num):
num = str(num)
if num.count('.') == 1:
left,right = num.split('.') #相当于left=num.split('.')[0] righ=num.split('.')[1]
if left.isdigit() and right.isdigit():
return True
elif left.startswith('-') and left[1:].isdigit() and right.isdigit():
return True
return False
print(num_float('-0.23'))