第六部分 函数+debug¶

In [ ]:
a = len('西华大学')
print(a)
b = len(['经济学院','经济学','班级'])
print(b)
In [ ]:
#1  不含任何参数的基础函数
def hello():
    print("hello")
In [ ]:
hello()
In [ ]:
#2  一个参数的基础函数
def hello(n):
    print("hello"+n)
In [ ]:
hello("小明")
In [ ]:
def opening():
    print('本学期是2024秋季学期')
    print('本课程是经济学院开设的课程')
    print('我正在学习python!')

opening()
#没有参数,也不能省略括号,如此例中的opening()
#没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值。
In [ ]:
#2  两个或更多参数的基础函数
def math(x,z):
    y = int((x+z)*(z-x+1)/2)
    return y
print(math(1,100))

[练习]
写一个贴现率10%,默认3年,根据收益,求现值

[练习]
写一个自己的len函数

位置参数、默认参数和不定长参数

In [ ]:
def stu(name, course):
    print('我的名字叫:' + name)
    print('我正在学习:' + course)

stu('宇','python')
#顺序传递,位置参数
In [ ]:
def  stu(name, course, school = '西华大学'):
    print('我的名字叫:' + name)
    print('我正在学习:' + course)
    print('我来至:' + school)

stu('宇','python')
#默认参数
In [ ]:
def  stu(name, course, school = '西华大学'):
    print('我的名字叫:' + name)
    print('我正在学习:' + course)
    print('我来至:' + school)

stu('宇','python','西南财大')
  • 可变参数
In [ ]:
student_info = {
    '李明' :  20,
    '李云' :  21,
    '李典' :  22,
    '张明' :  23,
    '王刚' :  24,
}

def  print_age(students) :
    for  student in students:
        print( f'学生:{student} , 年龄 {student_info[student]}')

# print_age(['李明', '李云', '李典'])
# print_age(['王刚'])
# print_age('王刚')
# print_age('李明', '李云', '李典')
In [ ]:
student_info = {
    '李明' :  20,
    '李云' :  21,
    '李典' :  22,
    '张明' :  23,
    '王刚' :  24,
}

def  print_age(*students) :
    for  student in students:
        print( f'学生:{student} , 年龄 {student_info[student]}')


print_age('李明', '李云', '李典')
  • 假如我们要传入的参数恰好已经在一个list(或者tuple) 中,比如 classone = ['王刚', '张明', '李典']
In [ ]:
classone = ['王刚', '张明', '李典']
print_age(classone[0], classone[1], classone[2])  
In [ ]:
print_age(*classone)
In [ ]:
def stu(*course):
    return course

order = stu('python','stata','julia','R')

print(order)
print(type(order))

#不定长参数
  • 关键字可变参数
In [ ]:
def addStudents(table,**students):
    for name,age in students.items():
        table[name] = age

table1 = {}
table2 = {}
addStudents(table1, 小李=18, 小王=19)
addStudents(table2, 小马=20, 小刚=21, 小红=22)
print(table1)
print('----------------')
print(table2)
In [ ]:
onebatch = {'小蓝': 20, '小绿': 24}
addStudents(table1, **onebatch)
print(table1)
In [ ]:
def stu(name , code ,**course):
    course['name']= name
    course['code']= code
    return course

order = stu('李华','123456',most = 'python',more = 'stata',litter = 'julia', hate = 'R')

print(order)
print(type(order))

[练习]
竞争打分成绩如下,计算去除最高分和最低分后的平均成绩。
list=[100,98,97,99,70]

[练习]¶

利用可变参数和解包。写一个不定长的显示系统。
records = [
('年级', 2023),
('称号', '经济学人','再世凯恩斯','学神'),
('坐标', 8, 323),
]

In [ ]:
def stu(*course):
    for i in course:
        print('课程名:' + i)

stu('python','stata','julia','R')       
In [ ]:
# print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)
print('python', 'stata', 'julia', sep = '+', end = '=?')
In [ ]:
print('python', 'stata', 'julia')
In [ ]:
import time

print("---RUNOOB EXAMPLE : Loading 效果---")

print("Loading",end = "")
for i in range(20):
    print(".",end = '',flush = True)
    time.sleep(0.5)

[练习]
把上面的写成函数,加载几个点和多少秒一个,自己定义。

In [ ]:
import random 

course = ['python', 'stata', 'julia']
def xhu(gpa):
    if gpa < 3:
        a = random.choice(course)
        return a
    elif 3 <= gpa < 4:
        b = random.choice (course)
        return b, 'R'

print(xhu(2.4))
print(xhu(3.5))
In [ ]:
result = xhu(3.5)

print(result[0])
print(result[1])
In [ ]:
class1, class2 = xhu(3.5)
# 元组的两个元素分别赋值给变量dish和egg
print(class1)
print(class2)
  • 局部变量
In [ ]:
var = '西华'

def test():
    var = '华西'
    print(f"在函数中,var的值是:{var}")


test()
print(f"在函数外,var的值是:{var}")
  • 如果在函数内部有 变量赋值语句,且该变量名和全局变量相同,会产生一个新的局部变量,而不是将全局变量进行重新赋值。
In [ ]:
var = '西华'

def test():
    print(f"在函数中,var的值是:{var}")

test()
In [ ]:
#变量内赋值
var = '西华'

def test():
    global  var
    var = '华西'
    print(f"在函数中,var的值是:{var}")

test()
print(f"在函数外,var的值是:{var}")
  • 变量作用域练习
In [ ]:
food = 600

def cost():
    shop = int(input('请输入本月的购物费用'))
    friend = int(input('请输入本月的社交费用'))
    variable_cost = shop + friend
    print('本月的变动消费是' + str(variable_cost))

def sum_cost():
    sum = food + variable_cost
    print('本月的总消费是' + str(sum))

cost()
sum_cost()
In [ ]:
food = 600
shop = int(input('请输入本月的购物费用'))
friend = int(input('请输入本月的社交费用'))
variable_cost = shop + friend
# 以上均为全局变量
print('本月的变动消费是' + str(variable_cost))

def sum_cost():
    sum = food + variable_cost
    print('本月的总消费是' + str(sum))

sum_cost()
In [ ]:
food = 600

def cost():
    global variable_cost
    shop = int(input('请输入本月的购物费用'))
    friend = int(input('请输入本月的社交费用'))
    variable_cost = shop + friend
    print('本月的变动消费是' + str(variable_cost))

def sum_cost():
    sum = food + variable_cost
    print('本月的总消费是' + str(sum))

cost()
sum_cost()

#global语句一般写在函数体的第一行,告诉Python,variable_cost是个全局变量
In [ ]:
# 函数的嵌套
print(len('西华大学'))
In [ ]:
food = 600

def cost():
    shop = int(input('请输入本月的购物费用'))
    friend = int(input('请输入本月的社交费用'))
    variable_cost = shop + friend
    print('本月的变动消费是' + str(variable_cost))
    return variable_cost


def sum_cost():
    sum = food + cost()
    print('本月的总消费是' + str(sum))


sum_cost()
In [ ]:
# 函数调用   本月消费增长率
def div(num1, num2):
    growth = (num1 - num2) / num2
    percent = str(growth * 100) + '%'
    return percent

def warning():
    print('你不可能一分钱都没花吧!')

def main():
    while True:
        num1 = float(input('请输入本月所总消费'))
        num2 = float(input('请输入上月所总消费'))
        if num2 == 0:
            warning()
        else:
            print('本月的消费增长率:' + div(num1,num2))
            break

main()

[练习]
工作时长不满六个月,发放固定奖金500元。
工作时长在六个月和一年之间(含一年),发放奖金120元月数(如8个月为960元)
工作时长在一年以上,发放奖金180元
月数 (如20个月为3600元)
可以定义两个函数,第一个函数功能为根据工作月数返回奖金额,第二个函数功能为打印出'该员工来了XX个月,获得奖金XXX元'。

[练习]
请你把这个程序封装成一个新的函数。

In [ ]:
import random
import time

kungfu = ['黄飞鸿','李小龙','叶问']
a = random.choice(kungfu) 
print('开奖倒计时',3)
time.sleep(1)  
print('开奖倒计时',2)
time.sleep(1)
print('开奖倒计时',1)
time.sleep(1)


print('恭喜'+a+'中奖!')  # 使用print函数打印幸运者名单

[练习]
标准大小的项目,需要1个人用80个工时完成(也就是1个人做10天)
计算方式1:工时计算 计算方式2:人力计算

[练习]
和电脑玩石头剪刀布

Debug¶

In [ ]:
a = input('请输入密码:')
if a == '123456'
    print('通过')
In [ ]:
#下面代码有哪些错误
while n<3:
    username = input("请输入用户名:")
    password = input("请输入密码:")
    if username = 'abc' and password = '123':
        print("登录成功")
        break
    else
        n=n+1
        print("输入有误")
else
    print("你输错了三次,登录失败")
In [ ]:
week = ['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
sunday = week[7]

print(sunday)
In [ ]:
a = []
a = append ('A','B','C')
print(a)
In [ ]:
dic = {
'新制度经济学':['科斯','张五常'],
'货币学派':['弗里德曼','安德森'],
'因果推断':['卡德','安格雷斯','伊本斯'],
}

ecnomic = input('你想查询哪个经济学家?(科斯、张五常、弗里德曼、安德森、卡德、安格雷斯、伊本斯)')
for  i in dic:  
    ac = [i]  # 读取各个字典的主演表
    if ecnomic in ac:
        print(ecnomic + '提出了' + i)
In [ ]:
dic = {
'新制度经济学':['科斯','张五常'],
'货币学派':['弗里德曼','安德森'],
'因果推断':['卡德','安格雷斯','伊本斯'],
}

ecnomic = input('你想查询哪个经济学家?(科斯、张五常、弗里德曼、安德森、卡德、安格雷斯、伊本斯)')
for  i in dic:  
    ac = [i]  # 读取各个字典的主演表
    print(ac)
#     if ecnomic in ac:
#         print(ecnomic + '提出了' + i)

多用 print() 和 注释

In [ ]:
#逻辑问题
import random

guess = ''

while guess not in ['正面','反面']:
    print('------猜硬币游戏------')
    print('猜一猜硬币是正面还是反面?')
    guess = input('请输入“正面”或“反面”:')

# 随机抛硬币,0代表正面,1代表反面
toss = random.randint(0,1)

if toss == guess:
    print('猜对了!你真棒')
else:
    print('没猜对,你还有一次机会。')
    guess = input('再输一次“正面”或“反面”:')
    if toss == guess:
        print('你终于猜对了!')
    else:
        print('大失败!')
In [ ]:
#最后一种,使用bug   输入非数字
age = int(input('你今年几岁了?'))
if age < 18:
    print('不可以喝酒噢')
  • 异常处理的机制 try…except…
In [ ]:
try:
    age = int(input('请输入一个整数:'))
except ValueError:
    print('要输入整数噢')
In [ ]:
while True:
    try:
        age = int(input('你今年几岁了?'))
        break
    except ValueError:
        print('你输入的不是数字!')

if age < 18:
    print('不可以喝酒噢')
In [ ]:
num = [1,2,0,3]
for x in num:
    print (6/x)
In [ ]:
num = [1,2,0,3]
for x in num:
    try:
        print (6/x)
    except ZeroDivisionError:
        print('0是不能做除数的!')
        
# https://www.runoob.com/python/python-exceptions.html
  • try…finally…
In [ ]:
def some_func():
    try:
        return 'from_try'
    finally:
        return 'from_finally'
In [ ]:
try:
    raise Exception("saa")
except Exception as e:
    print(e)
In [ ]:
def another_func(): 
    for _ in range(3):
        try:
            continue
        finally:
            print("Finally!")
In [ ]:
def one_more_func():  
    try:
        for i in range(3):
            try:
                1 / i
            except ZeroDivisionError:
                raise ZeroDivisionError("A trivial divide by zero error")
            finally:
                print("Iteration", i)
                break
    except ZeroDivisionError as e:
        print("Zero division error occurred", e)
In [ ]:
some_func()
In [ ]:
another_func()
In [ ]:
1 / 0
In [ ]:
one_more_func()

[练习] 找bug

In [ ]:
#题一
scores = {'语文':89, '数学':95, '英语':80}
sum_score = 0

def get_average(scores):
    for subject, score in scores.items():
        sum_score += score
        print('现在的总分是%d'%sum_score)
    ave_score = sum_score/len(scores)
    print('平均分是%d'%ave_score)

get_average(scores)
  • 上述的引申练习
In [ ]:
a = 1
def some_func():
    return a

def another_func():
    a += 1
    return a
In [ ]:
def some_closure_func():
    a = 1
    def some_inner_func():
        return a
    return some_inner_func()

def another_closure_func():
    a = 1
    def another_inner_func():
        a += 1
        return a
    return another_inner_func()
In [ ]:
some_func()
In [ ]:
another_func()
In [ ]:
some_closure_func()
In [ ]:
another_closure_func()
  • 上述的引申练习 再练习
In [ ]:
for x in range(7):
    if x == 6:
        print(x, ': for x inside loop')
print(x, ': x in global')

# 为什么?x 从未在循环外被定义...
In [ ]:
x = -1
for x in range(7):
    if x == 6:
        print(x, ': for x inside loop')
print(x, ': x in global')
In [ ]:
x = 1
print([x for x in range(5)])
print(x, ': x in global')

In [ ]:
def sum(var):
    to_var = var + 3
    print(to_var)
    
sum(3)    
#定义了一个新的局部变量,函数结束后,没法传给外部的全局变量
In [ ]:
#方法1 
scores = {'语文': 89, '数学': 95, '英语': 80}
sum_score = 0

def get_average(scores):
    global sum_score  # 声明 sum_score 是全局变量
    for subject, score in scores.items():
        sum_score += score
        print('现在的总分是%d' % sum_score)
    ave_score = sum_score / len(scores)
    print('平均分是%d' % ave_score)

get_average(scores)
In [ ]:
#方法2
scores = {'语文': 89, '数学': 95, '英语': 80}

def get_average(scores):
    sum_score = 0  # 在函数内部初始化 sum_score
    for subject, score in scores.items():
        sum_score += score
        print('现在的总分是%d' % sum_score)
    ave_score = sum_score / len(scores)
    print('平均分是%d' % ave_score)

get_average(scores)
In [ ]:
#题二
not_bad_word = True
while not_bad_word:
    x = input('请给旺财取个外号:')
    if x == '小狗' and x =='汪汪':
        not_bad_word = False
        print('我生气了,不想理你了!')

print('对不起,以后我不会这么叫你了')
In [ ]:
#题三
deposit = [100,300,900,2000,5000,0,2000,4500]

for i in range(1, len(deposit)):
    times = deposit[i]/deposit[i-1]
    print('你的存款涨了%f倍'%times)
In [ ]:
#方法1 
deposit = [100,300,900,2000,5000,0,2000,4500]

for i in range(1, len(deposit)):
    if deposit[i-1] == 0:  # 判断除数等于0时,特殊处理。
        print('你上次存款为 0 哦!')
    else:
        times = deposit[i]/deposit[i-1]
        print('你的存款涨了%f倍'%times)
In [ ]:
#方法2
deposit = [100,300,900,2000,5000,0,2000,4500]

for i in range(1, len(deposit)):
    try:      
        times = deposit[i]/deposit[i-1]
        print('你的存款涨了%f倍'%times)
    except  ZeroDivisionError :
        print('你上次存款为 0 哦!')
In [ ]:
# 练习
print('\n欢迎使用除法计算器!\n')

while True:
    try:
        x = input('请你输入被除数:')
        y = input('请你输入除数:')
        z = float(x)/float(y)
        print(x,'/',y,'=',z)
        break  
    except ZeroDivisionError:  
        print('0是不能做除数的!')
    except ValueError:  
        print('除数和被除数都应该是整值或浮点数!')