一.函数
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
1.函数定义
def 函数名(参数)
......
函数体
......
返回值
a.使用def关键字创建函数
b.函数名,def后面紧跟着的是函数名,每个函数都需要有个函数名
c.函数参数,分无参函数和有参数函数(下面详解)
d.函数体,实现函数功能的语句组合
e.返回值,返回函数执行结果数据给函数调用者
2.函数的使用
函数在定义完后是不执行函数体的,当python解释在读到def定义的函数名时,在内存中开辟一块空间把函数放进去,函数名作为变量明指向该内存空间,函数在调用的时候才执行函数体。在执行函数体时,一旦执行到return语句,函数执行过程立即终止(即使函数体中还有未执行的语句)返回值给调用函数,如果函数体中没有return语句,默认返回None给调用函数。
3.函数的参数
函数分为无参函数和有参函数;函数在定义的时候如果有参数统一称为形式参数,调用函数时传递的参数称为实际参数
3.1 普通参数
函数定义了几个参数,在调用的时候就需要传递几个参数(形参中有默认值的除外),传多或传少了在执行的时候会报错,传递实参时默认是和形参一一对应的。
#普通参数
def send(f1,f2): #定义了2个形参
#函数体
print(f1,f2)
return True
em=input(‘请输入邮件地址:‘)
result=send(em,‘hello‘) # 需要传递2个实参
if result == True:
print(‘发送成功‘)
else:
print(‘发送失败‘)
3.2 默认参数
形参中参数有默认值的参数,如果设置了默认参数,那么默认参数必须放到参数列表的最后面;调用的时候位置参数在前,关键字参数要在后面。
#默认参数,调用的时候可以不用传递值,也可以从新传递值
def send(f1,f2,XX=‘OK‘): #位置参数要在关键字参数前面,默认参数在调用的时候可以传参也可以不传
#函数体
print(f1,f2,XX)
return True
em=input(‘请输入邮件地址:‘)
result=send(em,‘hello‘) #传递2个实参,不改变默认参数的值
re=send(em,‘hel‘,‘NO‘) #传递3个实参,改变默认参数的值
if result == True and re == True:
print(‘发送成功‘)
else:
print(‘发送失败‘)
3.3 指定参数
#指定参数
def send(f1,f2,XX=‘OK‘):
#函数体
print(f1,f2,XX)
return True
em=input(‘请输入邮件地址:‘)
re=send(f1=em,f2=‘hel‘,XX=‘NO‘) #调用的时候指定参数值,参数名要和形参里一致(顺序到不必一致)
if re == True:
print(‘发送成功‘)
else:
print(‘发送失败‘)
3.4 动态参数
3.4.1 参数前面有一个*的参数
如果在形参前加一个*那么它就是元祖,可以接收任意个实际参数(形参前面加一个*号,在调用的时候该加*的形参可以接收传递的任意个实参,而不报错);如果在调用的时候传递的实参前面也有个*,那么就是把该实参里每个元素循环取出作为元素赋值给函数的形参,如果调用的时候前面不加*就是把该元祖实参作为一个子元祖传递给形参。
def func(*args):
print args
# 执行方式一
func(11,33,4,4454,5)
# 执行方式二
li = [11,2,2,3,3,4,54]
func(*li)
3.4.2 两个*的参数
两个**的参数,是字典, 如果在形参前加两个**那么它就是字典;调用的时候需要指定k和v,那么参数调用只能以指定参数来调用或传递的实参前面也有2个*(这个实参必须是字典),那么就 是把该实参赋值给函数的形参,如:
def func(**kwargs):
print args
# 执行方式一
func(name=‘wupeiqi‘,age=18)
# 执行方式二
li = {‘name‘:‘wupeiqi‘, age:18, ‘gender‘:‘male‘}
func(**li)
3.4.3 万能参数
def fname(*args,**kwargs) #只能一个*的在前面,2个*的在后面
print(args)
print(kwargs)
fname(11,22,33,k1=‘v1‘,k2=‘v2‘)
3.5 用动态参数实现format功能
format的函数形式是: format(*args,**kwargs)
1)位置参数
fstr=‘I am is {0},my age is {1}‘ #这里的0和1代表第几个参数
print(fstr.format(‘alex‘,22))
li=(‘alex‘,33)
print(fstr.format(*li))
2)变量参数
fstr2=‘I am is {name},my age is {age}‘
print(fstr2.format(name=‘pwj‘,age=21))
ld={‘name‘:‘sindy‘,‘age‘:18}
print(fstr2.format(**ld))
4.全局变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
全局变量,默认用大写变量名
对全局变量进行重新赋值,需要先global
name=‘wpj‘ #全局变量
age=22
def f1():
global age #先global,再重新赋值
age=22 #x修改全局变量,前面加global
name=‘alex‘ #这是局部变量,只在该函数里生效,优先使用自己的
print(name)
def f2():
print(name) #引用的是全局变量
f1()
f2()
5.三元运算
是if ..else ..的简写,
res= 1 if True else 2,如果if后面的条件为True那么res=1,否则res=2
6.lambda表达式(匿名函数)
匿名函数,lambda后面冒号前面跟的是参数(可以多个),冒号后面跟的是函数体(一句)隐含了return功能, 例如:f2=lambda a1,a2:a1+a2+100
7.常用内置函数的介绍
abs() #取绝对值
all(迭代对象) #一个为假,结果为假,all([11,22,33,0])结果为False
any(迭代对象) #,一个为真,结果为真,any((22,(),0)) 结果为True
bin() #把十进制转换成二进制,print(bin(5)) #结果:0b101
oct() #把十进制转换成八进制,print(oct(9)) #结果:0o11
hex() #把十进制转换成十六进制,print(hex(14)) #结果0xe
ascii()#自动执行对象的__repr__方法
callable() #判断对象是否是可调用对象