第六部分 函数+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('除数和被除数都应该是整值或浮点数!')