从零开始学python-犄角旮旯的笔记2-函数和Debug

说明:以下内容来自”风变编程“学习后的笔记梳理,仅为自己学习梳理干货和同学者阅读参考,不得转载。

1.函数

DRY原则——Don’t Repeat Yourself
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def math(x):  # 定义函数名和参数
    y = 3*x + 5  # 函数体
    return y  # 返回
# 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合
#      2. 不可与内置函数重名(内置函数不需要定义即可直接使用)
def math(x):
# 参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
# 规范:括号是英文括号,后面的冒号不能丢
    y = 3*x + 5
# 函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格
    return y
# return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略

函数中常见参数类型:
位置参数、默认参数、不定长参数

def opening():
    print('总有一种味道能温暖你~')
    print('深夜食堂正式开业啦!')
    print('欢迎来自五湖四海的你前来品尝!')

opening()

没有return语句的函数,Python会在末尾隐性地加上return None,即返回None值。

默认参数必须放在位置参数之后。不过默认参数并不意味着不能改变.

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

menu('话梅花生','牛肉拉面')
#因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。
def menu(appetizer, course, dessert = '绿豆沙'):
    print('一份开胃菜:' + appetizer)
    print('一份主食:' + course)
    print('一份甜品:' + dessert)

menu('话梅花生','牛肉拉面')
menu('话梅花生','牛肉拉面','银耳羹')
#银耳羹对应参数dessert

不定长参数:传递给参数的数量是可选的、不确定的。
它的格式比较特殊,是一个星号*加上参数名,它的返回值也比较特殊,为元组。

def menu(*barbeque):
    return barbeque

order = menu('烤鸡翅','烤茄子','烤玉米')
#括号里的这几个值都会传递给参数barbeque

print(order)  # ('烤鸡翅','烤茄子','烤玉米')
print(type(order))   # <class 'tuple'>

元组的写法是将数据放在小括号()中,它的用法和列表用法类似,主要区别在于列表中的元素可以随时修改,但元组中的元素不可更改。
print()函数的完整参数:

print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)

函数,不仅可以支持输入多个参数,而且也可以同时输出多个值,需将返回的值写在return语句后面,用英文逗号隔开即可。

import random 
appetizer = ['话梅花生','拍黄瓜','凉拌三丝']
def coupon(money):
    if money < 5:
        a = random.choice(appetizer)
        return a
    elif 5 <= money < 10:
        b = random.choice (appetizer)
        return b, '溏心蛋'

result = coupon(6)
# result是一个元组
print(result[0])  # 提取元组中的元素
print(result[1])  # 提取元组中的元素

另外一种方式:我们也可以同时定义多个变量,来接收元组中的多个元素:

dish, egg = coupon (7)
# 元组的两个元素分别赋值给变量dish和egg
print(dish)
print(egg)

2. 多函数的配合

当多个函数同时运行时,就涉及函数中一个非常重要的概念 —— 变量作用域:
(1)一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】,如cost()函数里的variable_cost。
icon
(2)在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】,如第一行的rent。

rent = 3000

def cost():
    utilities = int(input('请输入本月的水电费用'))
    food_cost = int(input('请输入本月的食材费用'))
    variable_cost = utilities + food_cost
    print('本月的变动成本是' + str(variable_cost))

def sum_cost():
    sum = rent + variable_cost
    print('本月的总成本是' + str(sum))

cost()
sum_cost() 
  # 运行会出现错误——NameError: name 'variable_cost' is not defined

在这里插入图片描述
解决办法:
(1)取巧:把局部变量都放在函数外,变成全局变量。
(2)global语句:global语句一般写在函数体的第一行,它会告诉Python,“我希望variable_cost是个全局变量,所以请不要用这个名字创建一个局部变量”。

3. 函数的嵌套

def语句后的代码块只是封装了函数的功能,如果没有被调用,那么def语句后面的代码永远不会被执行。
在这里插入图片描述
在这里插入图片描述

index() 函数:
用于找出列表中某个元素第一次出现的索引位置。
语法:list.index(obj),obj为object(对象)的缩写。

格式化:
%s 表示格式化一个对象为字符

Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".
如果您使用int而不是字符串,请使用%d而不是%s。
"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12

猜拳游戏:

# case 8 猜拳游戏

import random

# 出拳
punches = ['石头','剪刀','布']
computer_choice = random.choice(punches)
user_choice = ''
user_choice = input('请出拳:(石头、剪刀、布)')  # 请用户输入选择
while user_choice not in punches:  # 当用户输入错误,提示错误,重新输入
    print('输入有误,请重新出拳:')
    user_choice = input()

# 亮拳
print('————战斗过程————')
print('电脑出了:%s' % computer_choice)
print('你出了:%s' % user_choice)

# 胜负
print('—————结果—————')
if user_choice == computer_choice:  # 使用if进行条件判断
    print('平局!')
# 电脑的选择有3种,索引位置分别是:0石头、1剪刀、2布。
# 假设在电脑索引位置上减1,对应:-1布,0石头,1剪刀,皆胜。
elif user_choice == punches[punches.index(computer_choice)-1]:
    print('你赢了!')
else:
    print('你输了!')

3. Debug

四种情况:粗心;知识不熟练;思路不清;被动掉坑
bug1-粗心:
在这里插入图片描述
(1)^代表bug发生的位置。
(2)SyntaxError:语法错误
(3)=和==
在这里插入图片描述
bug2-知识不熟练:
当你发现知识点记不清或者不能确定的时候,就要及时复习或者上网搜索。不要强行写出自己不敢确定的代码,这种情况往往容易出错。如append()用法不熟练的话,先网上查一下正确用法:

a = []
a.append('A')
a.append('B')
a.append('C')
print(a)

bug3-思路不清晰:
在这里插入图片描述
在这里插入图片描述
bug4-被动掉坑:
(1)“ValueError”:“传入无效的参数”-解决办法:type()函数
(2)异常处理的机制:用try…except…语句,在异常出现时即时捕获,然后内部消化掉。
在这里插入图片描述

while True:
    try:
        age = int(input('你今年几岁了?'))
        break
    except ValueError:
        print('你输入的不是数字!')

if age < 18:
    print('不可以喝酒噢')
num = [1,2,0,3]
for x in num:
    try:
    #尝试执行下列代码
        print (6/x)
        #使用6除以num中的元素,并打印
    except ZeroDivisionError:
    #除非发生ZeroDivisionError报错,执行下列代码:
        print('0是不能做除数的!')
        #打印“0是不能做除数的!”

Python的所有报错类型查阅地址:
https://www.runoob.com/python/python-exceptions.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值