1.函数的基本使用
#一下五中文本使用utf8编码格式都可以
#coding:utf8
#coding=utf8
#encoding:utf8
#encoding=utf8
#-*- coding:utf8 -*-
def fun(x):
print(x)
fun(5,9)#形参和实参不匹配(实参大于形参)
F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
Traceback (most recent call last):
File "E:/workspace/pythonwork/senssic/sen.py", line 8, in <module>
fun(5,9)
TypeError: fun() takes 1 positional argument but 2 were given
Process finished with exit code 1
fun()#形参和实参不匹配(实参小于于形参)
F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
Traceback (most recent call last):
File "E:/workspace/pythonwork/senssic/sen.py", line 10, in <module>
fun()
TypeError: fun() missing 1 required positional argument: 'x'
Process finished with exit code 1
#coding:utf8
def fun(x,y='c'):#可以指定默认值
print(str(x)+y)
fun('u')#调用默认值
fun('i','o')#不使用默认值
F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
uc
io
Process finished with exit code 0
#coding:utf8
def fun(x=3,y='c'):
print(str(x)+y)
fun()#调用默认值
fun('u')#默认按顺序匹配,所以匹配第一个为x的形参
fun(y='u')#按照形参名字匹配
fun(z='u')#如果形参名字不存在则会报错
F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
Traceback (most recent call last):
File "E:/workspace/pythonwork/senssic/sen.py", line 8, in <module>
3c
uc
3u
fun(z='u')
TypeError: fun() got an unexpected keyword argument 'z'
Process finished with exit code 1
注意:默认参数必须从右到左定义
例如:
是错误的
函数默认返回None
>>>def fun():
pass
>>>z=fun()
>>>print(z)
>>>None
2.函数的全局变量和局部变量
#coding:utf8
num=100#全局变量
xyz='ccc'#全局变量
aaa=3
def fun():
# num=num-1#编译错误,这句代码可以解释为声明一个局部变量num然后num减1而不是全局变量减一,由于num未赋
#初始值所以编译不通过
# num-=1#错误同上
p=num#p为局部变量,函数内部可以直接获取到全局变量num的值
print(p-1)#获取全局变量的值并操作
xyz='rrr'#'局部变量与全局变量重名,影响局部变量,作用域
global gy#不能直接声明 global gy=‘xxx’ 会报错
gy= '局部函数的全局变量'#局部变量可以被函数外部访问到
#由于全局函数在函数内不能直接改变自己的值,形如: (num+=1-->编译器看来重新生成一个局部的num函数,未赋值就直接使用会报错,与java不同)
# 或 (xyz=‘ttt’-->只能作用与函数内部,外部访问xyz依然为‘ccc’),所以要想改变全局变量值或者自增自减,内部声明一样的全局变量
global aaa
if aaa==3:
aaa=333#声明为全局变量可以更改了
a-=1#全局变量自减一
print(xyz)
print(num)
fun()
print(xyz)
print(num)
print(gy)
print(aaa)
输出:
F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
100
99
rrr
ccc
100
局部函数的全局变量
332
Process finished with exit code 0
3.函数的元组列表字典传参以及类似可变参原理
#传入元组序列或字典如果需要符合类型格式化传入需要在前面加上*
#不然会认为只是作为一个参数传入
a=('c','y')
b=((1,2),(3,4))
def fun(x,y):
print(x+':'+y)
fun(*a)
def fun2(x,y):
for u,p in x,y:
print(str(u)+':'+str(y))
fun2(*b)#传入元组
d=['1','2']#传入序列
fun(*d)
def fun3(name,age):#字典中的key要和形参中的名字一致如:name和name
print(str(name)+':'+str(age))
c={'name':'senssic','age':21}
fun3(**c)#传入字典
#根据以上启示可以解决传多参的问题
def superFun(x,*args,**ditArgs):
print(x)
print(args)
print(ditArgs)
superFun(1)
superFun('c')
superFun(1,'c')
superFun(x=1,y=2,z='c')
superFun(3,3,9,y=2,z='c')#这样调用报错superFun(x=3,3,9,y=2,z='c') 因为此时x=3是关键字,编译器并不认为此时x为要找形参中的x而是当做关键字处理,python中的可 #变参数,*arg表示任意多个无名参数,类型为tuple,**kwargs表示关键字参数,为dict,使用时需将*arg放在**kwargs之前,否则会有“SyntaxE #rror: non-keyword arg after keyword arg”的语法错误
4.lambada表达式
#lambda表达式def f(x,y):
return x*y
print(f(3,4))
a=lambda x,y:x*y
print(a(3,4))