函数应用1

---恢复内容开始---

列表合并,并按顺序排列列打印出来

其中列表合并有四种

1.append()  向列表尾部追加一个新元素,列表只占一个索引位,在原有列表上增加
2.extend() 向列表尾部追加一个列表,将列表中的每个元素都追加进来,在原有列表上增加
3.+  直接用+号看上去与用extend()一样的效果,但是实际上是生成了一个新的列表存这两个列表的和,只能用在两个列表相加上
4.+= 效果与extend()一样,向原列表追加一个新元素,在原有列表上增加 如图

 

 
 

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()
----------------------------------------------------
定义函数
def greet(name):
    print(name+'早上好')
    return

第1行:def的意思是定义(define),greet是【函数名】(自己取的),再搭配一个括号和冒号,括号里面的name是参数(参数名也是自己取)。

第2行:def下一行开始缩进的代码是函数要实现的功能,也叫【函数体】。这里的函数体展现出的功能就是:打印出“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语句可以将局部变量声明为全局变量

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/zhuyanze/p/10568098.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值