Python14 函数

函数

面向对象编程: 类----class

面向过程编程:过程---def

函数式编程:函数---def

def test(x):

    '''描述'''

    x +=1

    return x

#def是定义函数的关键字

#test是函数名称

#(x)是参数

#x+=1是 函数体,是一段逻辑代码

#return 定义返回值,返回给test函数 ,并结束函数    

1.

def func1():
    '''test'''
    print ('in the func1')
    return 0

#函数式编程

def func2():
    '''test2'''
    print ('in the func2')

#定义面向过程的函数,没有return;  过程就是没有返回值的函数
x = func1()
y = func2()

print ('from func1 return is %s' %x)
print ('from func2 return is %s' %y)

image_1c0ai6ka017t3ukvlhs1nfh18dk9.png-3.9kB
虽然过程函数没有return,但是python会隐式的给返回一个None,所以两者差别并不大

2.

def logger():
    with open('test.txt','a') as f:
        f.write('end action\n')

def test1():
    print('in the test1')
    logger()

def test2():
    print('in the test2')
    logger()

def test3():
    print('in the test3')
    logger()

test1()        #执行函数
test2()
test3()

#可以看到三个函数都调用了logger这个函数,否则的话,我们需要在每三个函数中都要写

#with open这些代码; 调用了logger函数的话,就免去写重复的代码了。

我们要在三个函数每次写入的时候都加入时间戳

import time

def logger():
    time_format = '%Y-%m-%d  %X'    #定义格式为年、月、日、小时分钟秒
    time_current = time.strftime(time_format)   #显示时间,以time_format定义的格式来显示
    with open('test.txt','a') as f:
        f.write('%s end action\n' %time_current)

#修改logger函数,这样test的三个函数就全都被修改了。

#时间格式%后面的字母根据大小写的不同,显示的格式也不同。

image_1c0ai9j5n1rqapjrcot58hi0m.png-11.7kB
执行后看到文档内容

定义函数的好处:
代码重用
保持一致性(修改代码不会因为认为的原因导致相同的代码写错后不一致)
可扩展性

3.

image_1c0aic33g197k1jihg4t1qhoj2413.png-8.7kB
image_1c0aic8ml1s5obmk17u0cb2c0e1g.png-0.9kB
return除了会返回值给函数,还终止函数的运行,所以后面的print没有打印。

s = test()
print (s)

image_1c0aictks1mik8ou11nk17f17ei1t.png-1.3kB
return 将0返回给了test函数,赋值变量后,这个变量就等于这个return的值。
return几乎可以返回任何类型

为什么要用return,return的作用是什么: 在编程使用函数时,可能代码会很多,然后根据不同的结return不同的值,根据不同的值可以用作下面代码的判断,然后做不同的动作; 比如根据True或False,下面的代码执行不同的操作。

image_1c0aidg4k1nufe0g1d3i2mmncp2a.png-23kB
定义三个函数,一个没有return,一个return单个元素数字,一个return多个元素
image_1c0aidpm8m501m451hfki6nj6n2n.png-4.4kB
没有return默认返回None
return单个元素,会正常返回定义的值
return多个元素,会通过元组返回(相当于一个打包,然后一起返回)

4.

image_1c0aiesfn14lmhm3a4lgbu18qd34.png-4.8kB
定义带参数的函数
image_1c0aif63u197j1c1c1q281tek7rd3h.png-12.1kB
调用函数时,如果不赋值给参数就会报错

image_1c0aigj591cnb11ma17jj1b3v1195e.png-5.1kB
赋值给参数,位置要对应.
image_1c0aigter1rdf10os11eqgtud3n5r.png-0.5kB
1赋值给了x
2赋值给了y
x与y叫做形参:需要引用、被赋值的参数
1与2叫做实参:实际的参数
1与2是真是存在的,会在内存中占用空间;x与y是形式上的参数,如果x与y没有引用任何值,则不会占用内存空间。

image_1c0aihlnd1n9jh8t1nagkeh12lg68.png-5.6kB
默认的情况下,赋值参数需要位置一 一对应,否则的话就需要指定参数的赋值
image_1c0aihvff4a02911tnc1qin1du6l.png-0.5kB

image_1c0aii5ao1a2me75flm1heq1tqp72.png-6.4kB
位置参数和关键词参数是可以混写的,默认参数需要位置对应,1赋值给了x,2赋值给了y
image_1c0aiifeo1vvhl2o151p190vrk67f.png-0.8kB

image_1c0aiikj7c9ultn3ks1pa150g7s.png-6.5kB

image_1c0aiipvm1n2ddce4svfbrm5e89.png-9.5kB
这样赋值是会报错的,第一个赋值是y=1(使用的是关键词参数赋值),第二个我们使用的是位置参数赋值,但是第二个参数根据位置应该对应的是y,课时y在前面已经被占用了,所以会报错。

image_1c0aijpat1kjk1bis14ur1o3v17tc8m.png-6.8kB

image_1c0aik4no1mtj1ioj1c4rv3ov1693.png-9.5kB
可以看到关键参数在位置后面写就没有报错;

5.

image_1c0aikt5u1v8mjuv14bj1r3pke9g.png-5.3kB
在创建函数时,可以给参数赋值默认的值
image_1c0ail5b21hn61m2l1btc1frb1u5s9t.png-0.5kB
在给参数赋值时,如果不从新赋值,那么参数就会使用创建函数时给赋予的默认值

image_1c0ailni812v9dkk4gm1m3n1m48aa.png-7.9kB
可以通过位置和关键词来修改默认参数值
image_1c0aim29kg52qor1fufq6n2p7an.png-1kB
把参数从新赋值就不会使用默认参数值了,会使用新的赋值来覆盖默认的参数值

默认参数的用途:比如安装软件的默认路径,或者一些默认勾选的选项; 比如设置某个程序的默认端口等等。

6.参数组

当定义一个函数的参数时,实参不能少于或多于形参,否则执行就会报错; 有多少个实参,定义函数时就得定义多少个形参,但是如果参数需要一万个,则不可能去写一万个参数。

所以这里我们可以使用参数组;当需要的参数数量过多或者实参所需求的数量不明确时,就可以使用参数组;

image_1c0ain8d9epu1l8m18u05ov15ivb4.png-5.8kB
定义参数组的关键符号是‘*’,后面定义一个组名即可
image_1c0ainhqv1opp16b7km5166po3gbh.png-1.3kB

可以看到定义多少个参数都可以,打印时以元组形式打印出来。

‘*’ 用来接收N个位置参数,转换成元组;不能接收关键字参数。。

image_1c0aioei0f991b8p13fv1r9gu0ubu.png-7kB
image_1c0aipn45q7l1517rt2r2toopdr.png-1.4kB
传参数值的时候,也可以使用,比如([1,2,3,4,5]),只不过打印出来的时候会转换成元组

image_1c0aiq2ni4cnoioll66gk9ne8.png-8.1kB
image_1c0aiq96j1chb12a6k8o13gj16n7el.png-2.1kB
使用两个*,表示可以传入字典参数; 把N个关键字参数,转换成字典的方式。
’用来接收N个关键字参数,转换成字典。

test(**{'name':'zhangsan','age':20})

image_1c0aire835bj1nv71asm1v0c2maf2.png-2.1kB
传入参数也可以使用两个**,只不过字典的写法稍有差别

image_1c0airveuen71m991n1vnpu79sff.png-11.4kB
image_1c0ais514npm1pni1i4q1l121s1pfs.png-3kB
打印字典key对应的value

def test3(name,**kwargs):
    print (name)
    print (kwargs)

test3(123)

image_1c0aisrlg1rd4lnorvh5rr1lt6g9.png-0.8kB
位置参数和参数组一起使用;
这里没有定义参数组的值,所以打印出来为空的字典

def test3(name,**kwargs):
print (name)
print (kwargs)

test3('lisi',age=20,sex='M')

image_1c0aitmaprhv1c8acoe1t5o1is8gm.png-2.3kB
位置参数和参数组的值,被分开打印了

def test4 (name,age=18,**kwargs):            #在写普通参数和参数组时,要把参数组写在后面
    print (name)
    print (age)
    print (kwargs)

test4('lisi',sex='M',hobby='car')

image_1c0aiu6plh6d77l10hjciemu4h3.png-3.1kB
使用两个位置参数和一个参数组;第二个位置参数被打印的是默认值

test4('lisi',sex='M',hobby='car',age=20)

image_1c0aiutch1mnn1skatfnv6r1rnrhg.png-3.1kB
age位置参数不使用默认值,根据关键字参数的方式对其修改

test4('lisi',22,sex='M',hobby='car')

image_1c0aivenv154v15db106aj7ldhht.png-3kB
age根据位置参数的方式对其修改


image_1c0aj03jn1taim9c1736c2s6kfia.png-16kB

image_1c0aj0aqn7bq3d713uu1295crqin.png-4.3kB
*args 接收N个位置参数;**kwargs接收N个关键字参数; 在赋值个参数时,后面并没有符合位置参数的值,所以打印位置参数会显示一个空的元组。

test5 ('lisi',33,44,55,66,sex='M',hobby='car')

image_1c0aj0ti81fa74vl1hao9trql5j4.png-4.7kB
这样4种参数就都可以体现出来了

image_1c0aj19ou13c01ti31414kd6187rjh.png-24.3kB
函数嵌套函数;
image_1c0aj23d6ni21ek91v9p1nhssf0ke.png-5.5kB

image_1c0aj30ra1oenk3h1d5g1me01253lo.png-25.2kB

image_1c0aj2s191mh88qgi351gos1m30lb.png-28.6kB
可以看到此处的代码与上面的一样,只是logger这个函数在调用函数的下面,执行时就会报错,所以在调用函数时,一定要在相关函数的下面去掉用,否则是找不到相关内容的。

转载于:https://blog.51cto.com/daimalaobing/2046665

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值