变幻莫测的python(三)---函数

本文详细介绍了Python中函数的基本使用,包括形参与实参的匹配、默认参数、全局变量与局部变量的作用及区别,以及元组列表字典传参与类可变参原理。此外,还探讨了lambda表达式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值