函数应用1
---恢复内容开始---
列表合并,并按顺序排列列打印出来
其中列表合并有四种
1,合并:L = L1+L2
2,排序sorted(L) 默认从小到大排列,如果要从大到小排列就是sorted(L,reverse=True)
合起来就是
L=sorted(L1+L2, reverse=True)
例题
list3=[91, 95, 97, 99]
list2=[ 92, 93, 96, 98]
list3= [list1+list2]
a=sorted(list3)
print(a)
打印效果为 91 92 93 95 96 97 98 99
也可以用下面代码
>>> L1
=
[
1
,
3
,
5
,
7
]
>>> L2
=
[
2
,
4
,
6
,
8
]
>>> L1.extend(L2)
>>> L1
[
1
,
3
,
5
,
7
,
2
,
4
,
6
,
8
]
>>> L1.sort()
>>> L1
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
]
print()
;当我们需要实现“获取数据长度”这个功能,我们会要到len()
print(name+'早上好')
return
第1行:def的意思是定义(define),greet是【函数名】(自己取的),再搭配一个括号和冒号,括号里面的name是参数(参数名也是自己取)。
第3行:一个简单的return。函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)所以你也会看到,我们接下来的很多例子是省略了return语句的。
经营了一阵子之后,为了吸引更多的人流,你决定给每个顾客免费送上一份甜品绿豆沙,这时候你就可以用到【默认参数】,注意:默认参数必须放在位置参数之后。
def menu(appetizer,course,dessert='绿豆沙'): print('一份开胃菜:'+appetizer) print('一份主食:'+course) print('一份甜品:'+dessert) menu('话梅花生','牛肉拉面') #因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。
如果一个参数的值是相对固定的,那么设置默认参数就免去了每次都要传递的麻烦。但默认参数并不意味着不能改变,试试运行下列结果。
1 def menu(appetizer,course,dessert='绿豆沙'): 2 print('一份开胃菜:'+appetizer) 3 print('一份主食:'+course) 4 print('一份甜品:'+dessert) 5 6 7 menu('话梅花生','牛肉拉面') 8 menu('话梅花生','牛肉拉面','银耳羹') 9 #银耳羹对应参数dessert
一个萝卜一个坑,因为前两个参数已经有对应的值传递,Python会自动将'银耳羹'传递给参数dessert。
后来呢,盛夏来袭,你觉得卖烧烤是个不错的主意。但问题是每个人点的烤串数量都不同,你也不能限定死数量,这时候【不定长参数】就能派上用场,即不确定传递参数的数量它的格式比较特殊,是一个星号*
加上参数名,来看下面的例子
def menu(*barbeque): print(barbeque) menu('烤鸡翅','烤茄子','烤玉米') #这几个值都会传递给参数barbeque
你会发现输出的是这样的结果:('烤鸡翅', '烤茄子', '烤玉米')
,这种数据类型叫做元组(tuple).
元组的写法是把数据放在小括号()
中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。
当然我们也可以先生成一个元组,再传入参数。上述代码等价于:
1 order=('烤鸡翅','烤茄子','烤玉米') 2 #元组的长度没有限制 3 def menu(*barbeque): 4 print(barbeque) 5 menu(*order)
和列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它,这时候的代码就可以写成:
1 def menu(appetizer,course,*barbeque,dessert='绿豆沙'): 2 print('一份开胃菜:'+appetizer) 3 print('一份主菜:'+course) 4 print('一份甜品:'+dessert) 5 for i in barbeque: 6 print('一份烤串:'+i) 7 8 menu('话梅花生','牛肉拉面','烤鸡翅','烤茄子','烤玉米')
需要注意的是,这时候默认参数也需要放在不定长参数的后面,即dessert=’绿豆沙'
要放在*barbeque
后面,否则传递的值会对应不上。
return语句
前面我们提到,return是返回值,当你输入参数给函数,函数就会返回一个值给你。事实上每个函数都会有返回值,像我们之前学过的len()函数。
1 a=[1,2,3] 2 print(len(a))
当你把参数a放进len() 函数中,它返回来的是3这个数值(列表的长度)。之后,我们就可以调用这个值,比如用print()函数打印出来或干点儿别的。
像常见的type()函数、数据类型转换函数,还有我们之前学过的bool()都是这样,会返回一个值。
而print()函数本身比较特殊,它在屏幕上显示完相关的文本内容就没了,并不会返回一个值给我们。所以,它返回的是空值(None)
在自定义函数的时候,我们就可以用return语句规定该函数要返回什么值给我们。带return语句的函数是这样的:
1 def niduoda(age): 2 if age < 12: 3 return '哈,是祖国的花朵啊' 4 elif age < 25: 5 return '哇,是小鲜肉呢' 6 else: 7 return '嗯,人生才刚刚开始' 8 9 print(niduoda(30))
其实是因为在这些例题中,我们的函数功能都是第一时间把参数打印出来。而在很多时候,当多个函数之间相互配合时,我们并不需要第一时间就将结果打印出来,而是需要将某个返回值先放着,等到需要的时候再做进一步的处理。
下面来看个例子:
在我们关于爱情的天真幻想中,我希望我的梦中情人拥有XXX的脸蛋和XXX的身材。
现在需求如下:一、分别定义两个函数,参数为人名,能够返回字符串'XXX的脸蛋'和'XXX的身材';二、将上述两个函数的返回值拼接在一起之后,再打印出来。请你先思考一下,相信对你来说并不难,如果一步步地写,代码应该是这样的:
1 def face(name): 2 return name + '的脸蛋' 3 #该函数返回字符串'XXX的脸蛋' 4 def body(name): 5 return name + '的身材' 6 #该函数返回字符串'XXX的身材' 7 8 face('李若彤') 9 body('林志玲') 10 #分别调用face()和body()函数 11 12 print('我的梦中情人:'+face('李若彤') +' + ' + body('林志玲')) 13 #将返回值拼接并打印出来
前面也讲到,函数可以互相嵌套,所以第7、8行调用face()和body()函数的两行代码可以省略,因为第12行的print()函数中其实已经有调用这两个函数了。
这只是一个非常简单的例子,在类似这种多个函数相互配合的代码中,我们就会非常需要return语句,来帮我们先保留某个函数的返回值,等要用到的时候再调出来用。 但是这样的代码还有个问题,当我想多次调用函数的时候,就需要先复制print那行代码,再分别修改两个函数里的参数。这样的操作既不简洁,也不优雅。就像这样:
1 def face(name): 2 return name + '的脸蛋' 3 def body(name): 4 return name + '的身材' 5 print('我的梦中情人:'+face('李若彤') +' + ' + body('林志玲')) 6 #要再次调用就要复制一遍,然后改参数 7 print('我的梦中情人:'+face('新垣结衣') +' + ' + body('长泽雅美')
所以更常见的做法是:再定义一个主函数main()
,参数调用前两个函数的返回值。
1 def face(name): 2 return name + '的脸蛋' 3 def body(name): 4 return name + '的身材' 5 def main(dream_face,dream_body): 6 return '我的梦中情人:' + face(dream_face) + ' + ' + body(dream_body) 7 8 print(main('李若彤','林志玲')) 9 print(main('新垣结衣','长泽雅美'))
main()函数内部分别调用了face()和body()函数,参数dream_face和dream_body传递给了face()和body()函数的参数name,得到返回值,并打印。看起来有点绕,我们将函数运行的步骤分解,就一目了然了。
1 def a(name): 2 return name + '的脸蛋' 3 def b(name): 4 return name + '的身材' 5 def main(a_d,b_e): 6 return '我的梦中情人:'+a(a_d)+'+'+b(b_e) 7 print(main('刘万香','朱延泽')) 8 print(main('朱延泽','刘万香'))
main()函数内部分别调用了face()和body()函数,参数dream_face和dream_body传递给了face()和body()函数的参数name,得到返回值,并打印。
接下来要讲的是return的一个特别的用法,我们看到前面所有的return语句,都是返回1个值,如果要返回多个值,我们该怎么办呢?
还是看这段代码:
1 def face(name): 2 return name + '的脸蛋' 3 def body(name): 4 return name + '的身材' 5 print('我的梦中情人:'+face('李若彤') +' + ' + body('林志玲'))
在这段代码中,我们定义了两个函数,每个return语句分别返回关于“脸蛋”和“身材”的值。如果要一次性返回这两个值,我会这样做,你先看代码:
1 def lover(name1,name2): 2 face = name1 + '的脸蛋' 3 body = name2 + '的身材' 4 return face,body 5 6 a=lover('李若彤','林志玲') 7 print('我的梦中情人:'+a[0]+' + '+a[1])
为什么要这样写,第7行代码是啥意思?怎么看上去像是列表?你大概有这样的疑惑了吧!我们先来看看,一次性返回的两个值,是什么数据类型
('李若彤的脸蛋', '林志玲的身材')
是('李若彤的脸蛋', '林志玲的身材')
这样一个元组,对不对?又是元组
事实上,Python语言中的函数返回值可以是多个,而其他语言都不行,这是Python相比其他语言的简便和灵活之处。一次接受多个返回值的数据类型就是元组。
而元组与列表其实都是数据的“序列”,元组取某个位置的值的操作,与列表是一模一样的,即tuple[]
。也是因此,我们会这样去写代码:
现在你大概对return的作用有了更深的了解吧。我们继续总结:
最后需要再强调的是,没有return语句的函数会默认返回None值。
1 #第一个函数 2 def fun(): 3 a ='I am coding' 4 print(fun()) 5 6 #第二个函数 7 def fun(): 8 a='I am coding' 9 return a 10 print(fun())
打印值
1 None 2 I am coding
第一个函数因为没有return语句,返回None值,所以打印出None。
此外,return还有一个“副作用”:一旦函数内部遇到return语句,就会停止执行并返回结果。
1 def fun(): 2 return 'I am coding.' 3 return 'I am not coding.' 4 5 print(fun())
1 I am coding.
函数内部遇到第一个return就会返回,所以只会打印出'I am coding'。
题目是这样的:一、定义一个带有两个参数的函数,函数的功能是返回两个参数中较大的那个值;二、调用函数,将99的平方
和8888
赋值给参数,并将较大值打印出来。
der a(b,c) if b>c: return b elif b=c: return c ('一样大') else: return c print(a(99**2,8888))
好,return讲完了,现在我们来看今天的最后一个函数重要概念,变量作用域。
变量作用域
当我们定义一个函数的时候,很重要的事情就是理解函数中变量的作用域
第一点:在一个函数内定义的变量仅能在函数内部使用(局部作用域),它们被称作【局部变量】。
第二点:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们叫【全局变量】。
认真看完了吗?好,我们来看一个例子。
1 x=99 #全局变量x 2 def num(): 3 x=88 #局部变量x 4 print(x) 5 6 num() 7 #打印局部变量x 8 9 print(x) 10 #打印全局变量x
因为x=99
是在函数外赋值的,所以第一个变量x是全局变量;x=88
是在函数内赋值的,所以第二个变量x是局部变量。
虽然变量的名字相同(都是x),但因为全局变量和局部变量处在不同的“作用域”中,所以它们彼此井水不犯河水,都能打印出相应的结果。
但为了让程序更易读以及避免可能会出现的麻烦,建议局部变量和全局变量【不要】取相同的名字,以免混淆
你可以将定义的函数想象成一个私人房间,所以里面存数据的容器(变量)是私有的,只能在个人的房间里使用;而在函数外存数据的变量是公用的,没有使用限制
有几点需要注意。就像你不希望合租的人随意使用你私人房间里的物品,全局作用域中的代码中也不能使用任何局部变量。来看看一个新手容易踩的坑:
1 def egg(): 2 #定义了一个叫egg的函数 3 quantity = 108 4 #定义了一个变量quantity,并赋值为108 5 egg() 6 #调用egg() 函数 7 print(quantity) 8 # 打印egg() 函数里面的变量quantity
乍一看好像没毛病,但如果你运行,嘿嘿,终端会给你无情地报错
报错信息提示:前3行的代码都没毛病,坏就坏在第4行代码。然后问题是:NameError: name 'quantity' is not defined
这句话翻译成中文就是:变量quantity并没有被定义。其实,我们定义了,只不过是在函数egg() 内定义的,所以这是个局部变量。但问题是我们不能在定义的函数egg() 外面,也就是不能在全局作用域中使用这个局部变量。
那该怎么办呢?其实也很简单,就像私人房间里的人可以使*使用公共区域的物品,在函数内部的局部作用域,是可以访问全局变量的。
1 quantity = 108 2 #定义变量quantity,这不是在我们定义的函数内的,所以是全局变量。 3 def egg(): 4 #定义一个函数,叫egg() 5 print(quantity) 6 #函数内的功能是打印变量quantity 7 egg() 8 #调用这个函数
显然计算机成功地把变量quantity打印了出来。这是因为全局变量在哪里都可以被使用。
总之记住一句话,当变量处于被定义的函数内时,就是局部变量,只能在这个函数内被访问;当变量处于被定义的函数外时,就是全局变量,可以在程序中的任何位置被访问。
如果你非要将局部变量变成全局变量,就像把私人房间的东西挪到公共区域,可不可以呢?Python也是能够满足你的,只不过要用到一种新的语句global语句
,就像这样子:.
1 def egg(): 2 global quantity 3 #global语句将变量quantity声明为全局变量 4 quantity = 108 5 6 egg() 7 print(quantity)
我将以上三段代码放在一起,你可以仔细对比一***意第一个函数的写法是错误的。
1 def egg(): 2 quantity = 108 3 egg() 4 print(quantity) 5 #会报错,不能在函数外部(全局作用域)使用函数内的局部变量 6 7 quantity = 108 8 def egg(): 9 print(quantity) 10 egg() 11 #函数内的局部作用域,可以访问全局变量 12 13 def egg(): 14 global quantity 15 quantity = 108 16 egg() 17 print(quantity) 18 #global语句可以将局部变量声明为全局变量
---恢复内容结束---