第 9 关、喊出我的名字

1、函数是什么

函数是组织好的、可以重复使用的、用来实现单一功能的代码。比如说当我们需要实现“打印”这个功能,我们会用到print();当我们需要实现“获取数据长度”这个功能,我们会要到len()。而“print()”、“len()”都是我们的函数。

 

2、定义和调用函数

2-1、定义函数

定义函数的语法书写:def 函数名(参数名)(注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可)

def 函数名(参数1,参数2,...参数n):

 函数体

 return 语句

函数内部一旦遇到return语句,就会停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值(return None可以简写为return。)

 

2-2、调用函数

(1)不带参数的函数

def A():

print('山脚毕业')



A()

不带参数的函数调用:直接函数名+括号可调用(运行)函数。

(2)带参数的函数

其实我们的打印语句 print() 也是一个内置函数,他的格式大概如下:

def print('字符串'):

(打印'字符串'内容)

print('字符串')

以 print() 函数的形式来看后,我们会更好理解带参数的函数是怎么调用的,这里再举一个例子:

def teacher(name):

print(name)



teacher('七七')

这里我们定义了函数 teacher,并带有参数 name。这里的 name 相当于一个钥匙孔,teacher 相当于是一道门,如果我们没有用钥匙打开这个孔,我们就不能打开这道门去用里面的东西。所以为了打开 teacher 这道门,我们用了 ‘七七’ 这个钥匙成功打开(赋值)给 name ,才能让我们使用里面的打印函数。

3、函数重要概念

3-1、默认参数

默认参数必须放在位置参数之后。若调用函数时没有传递参数就为默认值,但如果调用时向默认参数传递了数据,则默认参数被新参数代替。

def  menu(appetizer,course,dessert='绿豆沙'):

    print('一份开胃菜:'+appetizer)

    print('一份主食:'+course)

    print('一份甜品:'+dessert)

menu('话梅花生','牛肉拉面')

#结果显示为:因为调用时只给了两个参数,第三个参数为默认值

#一份开胃菜:话梅花生

#一份主食:牛肉拉面

#一份甜品:绿豆沙

menu('话梅花生','牛肉拉面','银耳羹')

#结果显示为:因为调用时给了三个参数,第三个参数被更新

#一份开胃菜:话梅花生

#一份主食:牛肉拉面

#一份甜品:银耳羹

3-2、不定长参数

一个星号*加上参数名。当传入此处的参数数量不确定时使用,数据类型为元组(元组(tuple):写法是把数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它)。

  • 当默认参数在不定长参数后时,若想更改默认参数,需要注明dessert='银耳羹',例如:
def menu(appetizer,course,*barbeque,dessert='绿豆沙'):

    print('一份开胃菜:'+appetizer)

    print('一份主菜:'+course)

    print('一份甜品:'+dessert)

    for i in barbeque:

        print('一份烤串:'+i)

        

menu('话梅花生','牛肉拉面','烤鸡翅','烤茄子','烤玉米',dessert='银耳羹')

#结果显示为:

#一分开胃菜:话梅花生

#一份主菜:牛肉拉面

#一份甜品:银耳羹

#一份烤串:烤鸡翅

#一份烤串:烤茄子

#一份烤串:烤玉米
  • 当默认参数在不定长参数之前,则默认按顺序传递参数(默认参数会改变),剩下的参数均传递给不定长参数。
def menu(appetizer,course,dessert='绿豆沙',*barbeque):

    print('一份开胃菜:'+appetizer)

    print('一份主菜:'+course)

    print('一份甜品:'+dessert)

    for i in barbeque:

        print('一份烤串:'+i)

        

menu('话梅花生','牛肉拉面','银耳羹','烤鸡翅','烤茄子','烤玉米')

#结果显示为:

#一分开胃菜:话梅花生

#一份主菜:牛肉拉面

#一份甜品:银耳羹

#一份烤串:烤鸡翅

#一份烤串:烤茄子

#一份烤串:烤玉米

3-3、return 语句

我们的长度计算语句 len() 也是一个内置函数,他的格式大概如下:

def len('内容'):

  (计算'内容'长度)

  return 长度值

a='内容'

print(len(a))

这里再举一个例子来解释 return 语句:

def A():

  name = '七七'

  return name

print(A())

这里我们函数 A 定义的内容给变量 name 赋值 ‘七七’,并且返回(return)了这个值,在代码第 5 行,我们打印了这个函数,因为返回了值 name ,所以会打印出 ‘七七’。

注意:执行了 return 语句后,return 下面的语句不执行(这里依旧只打印出七七)

def A():

  name = '七七'

  return name

print('卡西')

print(A())

3-4、变量作用域

3-4-1、局部变量

在函数内定义的变量,仅能在函数内部使用(局部作用域)

def A():

  name='七七'



print(name)

上面的语句会报错,因为 name 是函数内的变量(即局部变量)。

3-4-2、全局变量

所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域)

teacher = '七七'

def A():

  name='卡西'

  print(teacher)



print(teacher)

A()

上面的语句运行后会打印两次 “七七”,因为变量 teacher 是全局变量,执行函数的时候可以正常打印出 teacher。

3-4-3、global 语句

可以将局部变量转换为全局变量,一般写在函数体的第一行

def A():

  global name

  name='七七'



A()

print(name)

以上语句将我们的局部变量 name 转换为全局变量,让我们在外部也能正常打印 name。(注意:一定要执行了函数 A ,才会执行 global 语句,才能将局部变量转换为全局变量)

3-4-4、易错点

局部变量和全局变量尽量不要取相同的名字,以免混淆

sum = 0

def A():

  sum = sum + 1

  print(sum)



A()

上面的代码会报错:“UnboundLocalError: local variable 'sum' referenced before assignment”,原因是什么呢?这是因为我们运行函数 A 时, sum = sum + 1 语句中,第一个 sum 是我们函数内的局部变量,而第二个 sum ,系统分辨不出是全局的还是局部的,懵了一下跟我们说我不清楚,所以要改正的话需要将局部变量转化全局变量:

sum = 0

def A():

  global sum

  sum = sum + 1

  print(sum)



A()

3-4-5、函数嵌套

sum = rent + cost() 的结果就是sum = rent + variable_cost(cost()函数的返回值)。最后调用函数时,也只需调用sum_cost()即可。

rent = 3000



def cost():

    utilities = int(input('请输入本月的水电费用'))

    food_cost = int(input('请输入本月的食材费用'))

    variable_cost = utilities + food_cost

    print('本月的变动成本是' + str(variable_cost))

    return variable_cost



def sum_cost():

    sum = rent + cost()#调用函数

    print('本月的总成本是' + str(sum))



sum_cost()

4、知识拓展

4-1、list() 函数

可以将数据转换为列表

a='七七'

a=list(a)

print(a)

# 结果为:['七', '七']

4-2、reversed() 函数 (以下仅做参考)

reversed()函数可以将数据反转,从后往前迭代。

reversed()之后,第二次for循环、list()、tuple()以及join()得到的结果都为空,原因就是b不是反转列表本身,而是一个列表反向迭代器,所以直接输出函数返回值会是类似于乱码,且reversed()之后,只在第一次遍历时返回值。

#参数是列表1:

a=[1,2,3,4,5]

b=reversed(a)

print(a)

#结果显示为:

#[1, 2, 3, 4, 5]

print(b)

#结果显示为:

#<listreverseiterator object at 0x06A9E930>

for i in b:#第一次遍历

  print(i)

#结果显示为:

#5 4 3 2 1

for i in b:#第二次遍历为空

  print(i)

#结果显示为:啥也没有



#参数是列表2:

a=[1,2,3,4,5]

b=reversed(a)

print(list(b))#第一次转换为列表

#结果显示为:

#[5,4,3,2,1]

print(list(b))#第二次

#结果显示为:

#[]



#参数是元组

t=(4,5,6)

tt=reversed(t)

print(t)

#结果显示为:

#(4, 5, 6)



print(tt)

#结果显示为:

#<reversed object at 0x06A07E50>



print(tuple(tt))

#第一次转换为元组

#结果显示为

#(6, 5, 4)



print(tuple(tt))

#第二次为空

#结果显示为()



#参数是字符串

s='cba'

ss=reversed(s)

print(s)

#结果显示为

#'cba'

print(ss)

#结果显示为

#<reversed object at 0x06A07E70>

print(list(ss))#第一次转换为列表

#结果显示为

#['a', 'b', 'c']

print(list(ss))#第二次为空

#结果显示为

#[]

5、习题

5-1、函数调用

last_month = 2000

def income():

  course_income = int(input('七七运营课程的收入是多少'))

  cafeteria_income = int(input('七七打工的收入多少'))

  income = course_income + cafeteria_income

  return income

def sum_income():

  sum = last_month + income()

  print('七七卡内余额' + str(sum)+'元')

sum_income()

问题:七七打工一个月的工资是3000元,但因为吃螺蛳粉被咖啡厅批评,扣除了5%的工资,运营月收入为6666元,则终端输出结果为?

A.七七卡内余额2850元

B.七七卡内余额9516元

C.七七卡内余额11516元

D.七七卡内余额8666元

答案:C

解析:12行调用sum_income()函数,并且在sum_income()函数内又调用了income()函数

sum = last_month + income() ,就是全局变量last_month加上income()函数的返回值。七七打工工资是3000*0.95=2850,所以返回值

variable_cost = cloths_cost + food_cost = 2850 + 6666 = 9516

sum = last_month + income() = 2000 + 9516 = 11516

5-2、函数的传参与条件判断

题目:编写一个函数使其可以通过输入零点后的分钟数得出现在是第几天几点几分,例如输入150,需要输出2:30.

答案:

def clock(min):

  if min//1440>0:

    day=min//1440

    min1=min%1440

    hour=min1//60

    min2=min1%60

    if min2==0:

      print('现在是第{0}天的{1}:{2}{2}'.format(day,hour,min2))

    else:

      print('现在是第{}天的{}:{}'.format(day,hour,min2))

  else:

    min1=min%1440

    hour=min1//60

    min2=min1%60

    print('现在是{}:{}'.format(hour,min2))

min=int(input('请问现在已经过去了多少分钟?'))

clock(min)

解析:一定要考虑到可能会超过一天的情况,所以使用条件判断来编写,若大于一天,则用变量day存储天数(一天有1440分钟),min1存储整除天数后剩下的分钟数,hour存储剩下分钟数中的小时数,最后余下min2存储无法凑满一小时的分钟数。同时发现如果当min2为0,即是整点时,结果为零,但必须表示为例如18:00,后面要两个零,由此再分出条件,当为整点时,输出两次0。使用format,在大括号里提取两次0即可。因为变量储存的永远为最新的赋值内容,所以直接更新min也可以。

def clock(min):

  if min//1440>0:

    day=min//1440 #得到整数的天数

    min=min%1440 #凑不满一天的剩余分钟数

    hour=min//60 #上行剩余分钟数又能化为多少小时

    min=min%60 #凑不满一小时的剩余分钟数

    if min==0:

      print('现在是第{0}天的{1}:{2}{2}'.format(day,hour,min))

    else:

      print('现在是第{}天的{}:{}'.format(day,hour,min))

  else:

    min=min%1440

    hour=min//60

    min=min%60

    print('现在是{}:{}'.format(hour,min))

#输入的分钟数不满一天,只需要输出小时与分钟



min=int(input('请问现在已经过去了多少分钟?'))

clock(min) #调用函数

5-3、全局变量

题目:这段代码是否正常运行,如果有错误,请指出错误。

xi = '七七'
yan = '延君'
qi = '卡西'

def check():
    if xi != '卡西' :
        xi = '卡西'
    if yan != '延君':
        yan = '延君'
    if qi != '七七':
        qi = '七七'

def say():
    print("助教{xi},{yan},{qi}祝大家成功".format(yan=yan,xi=xi,qi=qi))

check()
say()

答案:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章