欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[风云变幻编程 - python 语法] 第 9 级(喊出我的名字) - 定义和调用函数 - 注释

最编程 2024-03-22 13:46:47
...

【风变编程-python语法】第九关(喊出我的名字)—函数的定义和调用–笔记

python基础语法–函数:定义、调用和重要概念

1 函数是什么
函数与参数
2 定义和调用函数
2.1 定义函数
2.2 调用函数
3 函数重要概念
3.1 重要参数
3.2 return语句
3.3 变量作用域
- [ 练习作业]
(题1) hellokitty抽奖器
(题 2) 生成一副扑克牌

1 函数是什么

  • 函数是组织好的、可以重复使用、用来实现单一功能的代码。
  • 例如:print(‘hello’)
  • 内置函数:设定好,课重复使用的、实现单一功能
  • 自定义函数:封装好函数内部功能,等待调用。
  • 调用函数

2 定义和调用函数

定义函数

  • 定义语法
#定义函数:

def 函数名(参数1,参数2...参数n):
   函数体
   return 语句
   
#
      函数名:最好是取体现函数功能的名字,一般用小写字母和单下划线、数字等组合
def greet(name):  #参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同#规范:括号是英文括号,后面的冒号不能丢
   print(name+'早上好')  #函数体:函数体就是体现函数功能的语句,要缩进,一般是四个空格
   return      #遇到return语句,停止执行并返回结果。没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值,可省略。

调用函数

  • 调用语法
#调用方式:
def pika1():
   print('我最喜爱的神奇宝贝是:皮卡丘')
pika1()          #该函数没有参数,直接调用函数名。记得英文括号一定不能少
print('-------------------------------------------')
def pika2(name):
   print('我最喜爱的神奇宝贝是:'+name)
pika2('皮卡丘')   #需要给参数name赋值,每次调用都可以给参数赋不同的值
pika2('喷火龙')
print('-------------------------------------------')
def pika3(name,person):
   print('我最喜爱的神奇宝贝是:'+name)
   print('我最喜爱的驯兽师是:'+person)
pika3('卡比兽','小智')     #需要给两个参数分别赋值,并用逗号隔开,否则会报错
   
#显示:
我最喜爱的神奇宝贝是:皮卡丘
-------------------------------------------
我最喜爱的神奇宝贝是:皮卡丘
我最喜爱的神奇宝贝是:喷火龙
-------------------------------------------
我最喜爱的神奇宝贝是:卡比兽
我最喜爱的驯兽师是:小智
  • 调用关键:弄清楚这个函数有多少个参数,如何给参数赋值,这个过程叫做参数的传递。
  • 可将复杂的语句和功能统一封装进一个函数名里,调用者只需明白函数能实现什么,根据需要传递参数即可。
def tree(Height):
   print('Mery Christmas!')
   for i in range(Height):
       print((Height-i)*2*' '+'o'+ i*'~x~o')
       print(((Height-i)*2-1)*' '+(i*2+1)*'/'+'|'+(i*2+1)*'\\')
tree(4)
print('-----------------------------------------------')
tree(8)
#显示:
Mery Christmas!
       o
      /|\
     o~x~o
    ///|\\\
   o~x~o~x~o
  /////|\\\\\
 o~x~o~x~o~x~o
///////|\\\\\\\
-----------------------------------------------
Mery Christmas!
               o
              /|\
             o~x~o
            ///|\\\
           o~x~o~x~o
          /////|\\\\\
         o~x~o~x~o~x~o
        ///////|\\\\\\\
       o~x~o~x~o~x~o~x~o
      /////////|\\\\\\\\\
     o~x~o~x~o~x~o~x~o~x~o
    ///////////|\\\\\\\\\\\
   o~x~o~x~o~x~o~x~o~x~o~x~o
  /////////////|\\\\\\\\\\\\\
 o~x~o~x~o~x~o~x~o~x~o~x~o~x~o
///////////////|\\\\\\\\\\\\\\\

3 函数的重要概念

1)重要参数类型:位置、默认、不定长参数

  • 位置参数:按参数对应的位置顺序及进行传递。
#代码

def menu(appetizer,course):
   print('一份开胃菜: '+appetizer)
   print('一份主食:' + course+'\n')
   
menu('牛肉拉面','话梅花生')
menu('话梅花生','牛肉拉面')

menu(course='牛肉拉面',appetizer='话梅花生')     #这样调用则不需要考虑参数位置

#显示
一份开胃菜: 牛肉拉面
一份主食:话梅花生

一份开胃菜: 话梅花生
一份主食:牛肉拉面

一份开胃菜: 话梅花生
一份主食:牛肉拉面
  • 默认参数放在位置参数之后,默认传递顺序
  • 如果一个参数的值是相对固定的,设置默认参数就免去了每次都要传递的麻烦。
  • 但默认参数也可以被改变。
#代码1.免去固定参数传递的麻烦

def menu(appetizer,course,dessert='绿豆沙'):
   print('一份开胃菜: '+appetizer)
   print('一份主食:' + course)
   print('一份甜品:' + dessert)

menu('话梅花生','牛肉拉面')     #已默认将'绿豆沙'传递给dessert,调用时无须再传递。

#显示
一份开胃菜: 话梅花生
一份主食:牛肉拉面
一份甜品:绿豆沙

#代码 2.也可以改变固定参数的值

def menu(appetizer,course,dessert='绿豆沙'):
   print('一份开胃菜: '+appetizer)
   print('一份主食:' + course)
   print('一份甜品:' + dessert)

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

#显示
一份开胃菜: 话梅花生
一份主食:牛肉拉面
一份甜品:银耳羹
  • 不定长参数:不确定传递参数的数量时使用。*参数名
#代码
def menu(*barbeque):
  print(barbeque)

menu('鸡翅','烤茄子','烤玉米','烤羊肉串')

#显示
('鸡翅', '烤茄子', '烤玉米', '烤羊肉串')

此时输出的数据类型是:元组(‘鸡翅’, ‘烤茄子’, ‘烤玉米’, ‘烤羊肉串’),其与列表用法类似,区别在于列表中元素可随时修改,元组中元素不可更改。

#代码等价于:
order=('鸡翅','烤茄子','烤玉米','烤羊肉串')#先生成元组

def menu(*barbeque):
  print(barbeque)

menu(*order)

#显示
('鸡翅', '烤茄子', '烤玉米', '烤羊肉串')

元组可用for循环遍历当中的元素,默认参数也需要放在不定长参数后面
(输出根据函数内部顺序,但参数出阿迪必须吧补丁参数放在前)。

#代码:
def menu(appetizer,course,*barbeque,dessert='绿豆沙'):
  print('一份开胃菜: '+appetizer)
  print('一份主食:' + course)
  print('一份甜品:' + dessert)
  for i in barbeque:
      print('烤串: '+i)

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

#显示
一份开胃菜: 话梅花生
一份主食:牛肉拉面
一份甜品:绿豆沙
烤串: 鸡翅
烤串: 烤茄子
烤串: 烤玉米
烤串: 烤羊肉串

2)return语句

  • return是返回值,当你输入参数给函数,函数就会返回一个值给你。
  • 自带函数有返回值。如:len() 函数返回(列表的长度)的数值;type(),bool()都返回一个值,print()返回空值(None)
  • 自定义函数可以用return语句规定返回什么值
#代码:
def niduoda(age):
  if age<12:
      return '哈,是祖国的花朵呀~~'
  if age<25:
      return '哇,是小鲜肉呢!'
  else:
      return '嗯,人生才刚刚开始!!!'

print(niduoda(35))    #####函数的嵌套使用

#显示
嗯,人生才刚刚开始!!!
  • 1)当不需要第一时间打印出结果,可以用return语句保留返回值。

#代码:
def name(name1):
 return name1+'的脸蛋'
def body(body1):
 return body1+'的身材'

print('我希望的梦中情人拥有'+name('林志玲')+'+'+body('杨幂'))

#显示
我希望的梦中情人拥有林志玲的脸蛋+杨幂的身材
  • 2)需要多次调用函数时,在定义一个主函数main(),调用非主函数的返回值。

  • 特别用法:所有return语句都返回1个值,返回多个值时,数据类型是元组
#代码:
def lover(name1,name2):
 face= name1+'的脸蛋'
 body= name2 +'的身材'
 return face,body

a=lover('李若彤','林志玲')
print(a)
print('我的梦中情人:'+a[0]+'+'+a[1])  #a为元组,可通过取位置操作取出元素。
#显示
('李若彤的脸蛋', '林志玲的身材')
我的梦中情人:李若彤的脸蛋+林志玲的身材
  • 3)python函数的返回值可以是多个,多个返回值的数据类型是元组。没有return语句默认返回None值。return放在函数体最后一句更要,因为一旦函数内部遇到return语句,就会停止执行并返回结果。

  • 特别用法:所有return语句都返回1个值,返回多个值时,数据类型是元组

3)变量作用域:局部变量、全局变量

  • 局部变量:在一个函数内定义的变量仅能在函数内部使用(局部作用域)。
  • 全局变量:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域)。
#代码:
x = 99

def num():
  x = 88  # 局部变量x
  print(x)

num()     # 打印局部变量x
print(x)  # 打印全局变量x
#显示
88
99
  • 两者在不同位置被赋值,建议局部变量与全局变量不要去相同名字以免混淆,局部变量是函数私有,属局部作用域,全局变量是公用的,属于全局作用域。
  • 直接在全局力调用局部作用的变量,运行将报错。而全局变量可以在局部被调用。
#代码:第一种情况:在全局作用域调用局部变量,运行报错。
def egg():
   quantity=108
egg()

print(quantity)
#显示
print(quantity)
NameError: name 'quantity' is not defined

#代码:第二种情况:直接调用函数,返回值空。
def egg():
   quantity=108
egg()

print(egg())
#显示
None

#代码:第三种情况:使用global语句将局部变量变成全局。
def egg():
   global quantity
   quantity=108
egg()

print(quantity)
#显示
108
#代码:
def egg():
   quantity=108
egg()

print(egg())
#显示
print(quantity)
NameError: name 'quantity' is not defined

【练习题】

1 hellokitty抽奖器

  • 问题:
    练习目标:
    通过项目练习,学习函数的封装和调用。我们已经有一个hellokitty抽奖器,现在,请你把这个程序封装成一个新的函数。
#代码:
import random
import time

def choujiang1(one,two,three):
   lucklist=[one,two,three]
   luck=random.choice(lucklist)   #从序列中随意选取一个元素
   print('{},{},{}参与抽奖,让我们来看一下,谁会成为今天的幸运儿!'.format(one,two,three))
   print('---------------------------------------------')
   print('开奖倒计时:3')
   time.sleep(1)
   print('开奖倒计时:2')
   time.sleep(1)
   print('开奖倒计时:1')
   time.sleep(1)
   image = '''
   /\_)o<
   |      \\
   | O . O|
   \_____/
   '''
   print(image)
   print('恭喜 {} 中奖!!'.format(luck))

choujiang1('A','B','C')
#显示
A,B,C参与抽奖,让我们来看一下,谁会成为今天的幸运儿!
---------------------------------------------
开奖倒计时:3
开奖倒计时:2
开奖倒计时:1

   /\_)o<
   |      \
   | O . O|
   \_____/
   
恭喜 B 中奖!!
  • 其中random.choice()函数可以用来从序列中任意抽取一个元素。

2 生成一副扑克牌

  • 问题:
    练习目标:
    通过Python优雅地生成一副扑克牌,我们将通过这个练习,简单地复习一下return的用法。
    另外,这个练习也要求你能够快速地学习新知识并将其运用出来。
    新知识有3个:一种新的列表生成方式、extend 的新用法和列表生成式。
#代码:
def cards():
   color=['红心','方块','梅花','黑桃']
   num =list(range(2,11))
   num.extend('JQKA') #通过两行代码,生成2-A
   return[(x,y) for x in color for y in num ]

print(cards())
#显示
[('红心', 2), ('红心', 3), ('红心', 4), ('红心', 5), ('红心', 6), ('红心', 7), ('红心', 8), ('红心', 9), ('红心', 10), ('红心', 'J'), ('红心', 'Q'), ('红心', 'K'), ('红心', 'A'), ('方块', 2), ('方块', 3), ('方块', 4), ('方块', 5), ('方块', 6), ('方块', 7), ('方块', 8), ('方块', 9), ('方块', 10), ('方块', 'J'), ('方块', 'Q'), ('方块', 'K'), ('方块', 'A'), ('梅花', 2), ('梅花', 3), ('梅花', 4), ('梅花', 5), ('梅花', 6), ('梅花', 7), ('梅花', 8), ('梅花', 9), ('梅花', 10), ('梅花', 'J'), ('梅花', 'Q'), ('梅花', 'K'), ('梅花', 'A'), ('黑桃', 2), ('黑桃', 3), ('黑桃', 4), ('黑桃', 5), ('黑桃', 6), ('黑桃', 7), ('黑桃', 8), ('黑桃', 9), ('黑桃', 10), ('黑桃', 'J'), ('黑桃', 'Q'), ('黑桃', 'K'), ('黑桃', 'A')]

  • 注意:list.append(object) 向列表中添加一个对象object,而list.extend(sequence) 把一个序列seq的内容添加到列表中。
  • 列表生成方式:(x,y) for x in color for y in num

推荐阅读