Python基础语法9
练习:打印99乘法表
for b in range(1,10):
a = 1
while a <= b:
print('{}{}{}{}{}'.format(a,'x',b,'=',a * b),end = ' ')
#end=' ',以空格结尾
a += 1
if a > b:
print('\n')
#print('') #用来换行
练习2
'''
一次测评中,老师将 学习小组A 和 学习小组B 的测评成绩(满分 100 分)从低到高记录放进两个列表:
A = [91, 95, 97, 99],B = [92, 93, 96, 98] 。
现在,老师想将两个小组的成绩合并为一个列表,并按照从低到高的顺序排序
'''
A = [91,95,97,99]
B = [92,93,96,98]
total = A + B
print(total)
for num1 in range(8):
for num2 in range(num1 + 1,8):
if total[num2] <= total[num1]:
total[num1],total[num2] = total[num2],total[num1]
print(total)
#法二
list1 = [91, 95, 97, 99]
list2 = [92, 93, 96, 98]
# 把 A 组成绩赋值给一个新列表,用来存合并的成绩——这个细节要注意!
list3 = list1.copy()
list3.extend(list2)
print(list3)
list3.sort()
print(list3)
'''
上一个练习中,我们完成了两组成绩的合并和排序。
不过,有了新的需求:想知道两组的平均分,以及把低于平均分的成绩也打印出来。
'''
sum = 0
less = []
for i in range(8):
sum += total[i]
print(sum)
average = sum / 8
print('平均成绩是{}'.format(average))
for t in range(8):
if total[t] <= average:
less.append(total[t])
print('低于平均分的成绩有{}'.format(less))
# 法二
# 请你改造这个代码,用更简洁的方式满足老师的需求。
import numpy as np # 导入 numpy库,as 即为导入的库起一个别称,别称为np
scores1 = [91, 95, 97, 99, 92, 93, 96, 98]
sum = 0
scores2 = []
average = np.mean(scores1)
#for score in scores1:
#sum = sum + score
#average = sum/len(scores1)
# 上面最好不要去数有几个学生,那样的话,学生数目发生变化就要调代码。
print('平均成绩是:{}'.format(average))
for score in scores1:
if score < average:
scores2.append(score) # 少于平均分的成绩放到新建的空列表中
print(' 低于平均成绩的有:{}'.format(scores2)) # 上个关卡选做题的知识。
函数
编写代码要不断追求简洁和易读。换句话说,我们要尽量避免写重复的代码,少复制粘贴,也就是所谓的DRY原则——Don't Repeat Yourself。
- 函数则是Python里增强代码重用性最有力的工具
- 之前所写的代码都是立即运行且只能被执行一次,而函数可以让我们整合打包好代码,以便这些代码能够随时被复用,这样能极大地减少代码冗余。
- 将一个程序用函数拆分成多个独立的子任务来完成,就会让代码结构变得清晰许多
函数的组成
Python中,“喂”给函数一些数据,它就能内部消化,执行相应的功能,最终给你“吐”出你想要的东西,就好比自动贩卖机一样。
- 函数后面都跟了个括号,括号里放的东西,也就是我们需要输入给函数的数据,它在函数中被称作【参数】。【参数】指向的是函数要接收、处理怎样的数据(你也可以把它理解成自变量)。
#例len()函数
a = len('万物的终极答案是42')
print(a)
b = len(['海伯利安','基地','三体'])
print(b)
定义和调用函数
-
编写函数的第一步,我们需要去定义一个函数
'''以y = 3x + 5 为例子,来定义一个一次函数'''
# 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合
# 2. 不可与内置函数重名(内置函数不需要定义即可直接使用)
def math(x):
# 参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
# 规范:括号是英文括号,后面的冒号不能丢
y = 3*x + 5
# 函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格
return y
# return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略
- 第1行:def的意思是定义(define),math是【函数名】(自己取的),再搭配一个英文括号和冒号,括号里面的x是参数(参数名也是自己取)。
- 第2行:def下一行开始缩进的代码就是函数要实现的功能,也叫【函数体】。这里的功能就是:根据x计算出一个值y。
- 第3行:return语句是返回的意思,可以指定函数执行完毕后最终会返回什么值或表达式,否则计算机是无法判断出函数最终要输出什么结果的。
定义函数只是将函数的内部功能封装起来,调用函数输入函数名和参数所对应的值,这个过程在函数里叫作参数的传递(pass)
def math(x):
y = x ** 2 + x
return y
a = math(10)
print(a)
print(math(20))
print(math(30))
#定义len()函数
def my_len(words):
counter = 0
for i in words:
counter = counter + 1
return counter
函数的进阶使用
参数类型
位置参数、默认参数和不定长参数。
def opening():
print('总有一种味道能温暖你~')
print('深夜食堂正式开业啦!')
print('欢迎来自五湖四海的你前来品尝!')
opening()
- 上面代码定义了一个opening()函数,但是括号里没有带参数,原因是这个函数的功能是打印出固定的三句话,不需要参数的参与,需要强调的是,即便是没有参数,我们在调用函数的时候也不能省略括号,如此例中的opening()。
- 在这个例子里,也不需要return语句,原因是这个函数直接在屏幕打印出内容,不需要返回值。事实上,没有return语句的函数,Python也会在末尾隐性地加上return None,即返回None值。
def menu(appetizer, course):
print('一份开胃菜:' + appetizer)
print('一份主食:' + course)
menu('话梅花生','牛肉拉面')
#如果采用下面这种形式传递,就不需要理会参数位置
menu(course = '牛肉拉面', appetizer = '话梅花生')
- 上面代码中'话梅花生'和'牛肉拉面'是对应参数的位置顺序传递的,所以appetizer和course被叫作【位置参数】,当有多个参数的时候,我们就必须按照顺序和数量传递,这也是最常见的参数类型。
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
- 一个萝卜一个坑,因为前两个位置参数已经有对应的值传递,Python会自动将'银耳羹'传递给参数dessert,替换了默认参数的默认值。
def menu(*barbeque):
return barbeque
order = menu('烤鸡翅','烤茄子','烤玉米')
#括号里的这几个值都会传递给参数barbeque
print(order)
print(type(order))
不限定死数量,这时候【不定长参数】就能派上用场,即传递给参数的数量是可选的、不确定的。它的格式比较特殊,是一个星号*加上参数名
函数返回的是这样的结果:('烤鸡翅', '烤茄子', '烤玉米'),我们用type()函数可以知道这种数据类型叫作元组(tuple)
和列表一样,元组是可迭代对象,这意味着我们可以用for循环来遍历它,这时候的代码就可以写成:
def menu(*barbeque):
for i in barbeque:
print('一份烤串:' + i)
menu('烤香肠', '烤肉丸')
menu('烤鸡翅', '烤茄子', '烤玉米')
# 不定长参数可以接收任意数量的值
#print()分解
print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)
# sep控制多个值之间的分隔符,默认是空格
# end控制打印结果的结尾,默认是换行)
返回多个值
要返回多个值,只需将返回的值写在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])
# result是一个元组
for i in result:
print(i)
# 我们也可以同时定义多个变量,来接收元组中的多个元素
dish, egg = coupon(7)
# 元组的两个元素分别赋值给变量dish和egg
print(dish)
print(egg)
'''
('凉拌三丝', '溏心蛋')
<class 'tuple'>
'''
- <class 'tuple'>表示返回的数据类型又是我们刚才提到的元组。在这个例子中,该元组是由两个元素构成的,我们可以用多种方式提取
多函数间的配合
变量作用域
- 报错代码
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()
#报错信息指出问题出在第10行,sum_cost()函数内的变量variable_cost没有被定义
- 这里涉及一个变量作用域的问题:程序中的变量并不是在哪个位置都可以被使用的,使用权限决定于这个变量是在哪里赋值的。
- 第一点:一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】,如cost()函数里的variable_cost。
-
第二点:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】,如第一行的rent。
- 上述例子中,变量rent是在函数外被赋值的,所以它是全局变量,能被sum_cost()函数直接使用。
- 变量variable_cost是在cost()函数内定义的,属于局部变量,其余函数内部如sum_cost()无法访问。事实上,当cost()函数执行完毕,在这个函数内定义的变量都会"消失”。
- 如何解决“局部变量”和”全局变量“之间的矛盾
- 第一种方法最取巧:把局部变量都放在函数外,变成全局变量。
- 函数内修改的方法,global语句可以将局部变量声明为全局变量 。
#法一
rent = 3000
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))
sum_cost()
#法二
rent = 3000
def cost():
global variable_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()
- global语句一般写在函数体的第一行,它会告诉Python,“我希望variable_cost是个全局变量,所以请不要用这个名字创建一个局部变量”。所以sum_cost()函数内部现在可以直接使用声明后的全局变量variable_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()
- cost()函数运行结束后会返回变量variable_cost,而sum_cost()函数内部调用了cost(),所以调用sum_cost()的时候,cost()函数也会执行,并得到返回值variable_cost。
- sum = rent + cost() 的结果就是sum = rent + variable_cost。最后调用函数时,也只需调用sum_cost()即可。
例
def div(num1, num2):
growth = (num1 - num2) / num2
percent = str(growth * 100) + '%'
return percent
def warning():
print('Error: 你确定上个月一毛钱都不赚不亏吗?')
def main():
while True:
num1 = float(input('请输入本月所获利润'))
num2 = float(input('请输入上月所获利润'))
if num2 == 0:
warning()
else:
print('本月的利润增长率:' + div(num1,num2))
break
main()
- div()函数会计算并返回利润率,warning()函数是打印出一句提示,它们都被嵌套在main()主函数里,当满足不同的条件时,这两个子函数会被调用。
-
虽然定义了三个函数,但最后只需调用main()函数即可。
练习
'''
发放奖金的要求如下:
工作时长不满六个月,发放固定奖金500元。
工作时长在六个月和一年之间(含一年),发放奖金120元*月数(如8个月为960元)
工作时长在一年以上,发放奖金180元*月数 (如20个月为3600元)
我们可以定义两个函数,第一个函数功能为根据工作月数返回奖金额,第二个函数功能为打印出'该员工来了XX个月,获得奖金XXX元'。
'''
def pay(month):
if 0 < month < 6:
pay = 500
elif 6 <= month <= 12:
pay = 120 * month
elif 12 < month:
pay = 180 * month
return pay
def condition():
print('{}来了{}个月,获得奖金{}元'.format(name,month,pay(month)))
global name,month
name = input('请输入员工的姓名:')
month = int(input('请输入员工的工作时间:'))
condition()
参考代码
def bonus(month):
if month < 6:
money = 500
return money
elif 6 <= month <= 12:
money = 120 * month
return money
else:
money = 180 * month
return money
def info(name, month):
gain = bonus(month)
print('%s来了%s个月,获得奖金%s元' % (name, month, gain))
info('大聪',14)
练习:抽奖代码
# 查看注释,运行代码。
import random
import time
# 将抽奖程序封装成函数
def choujiang(q,w,e): # 定义一个抽奖函数,带有3个参数,也就是3位候选人
luckylist = [q,w,e] # 定义一个中奖名单的列表
a = random.choice(luckylist) # 在中奖名单里面随机选择
print('开奖倒计时',3)
time.sleep(1)
print('开奖倒计时',2)
time.sleep(1)
print('开奖倒计时',1)
time.sleep(1)
image = '''
/\_)o<
| \\
| O . O|
\_____/
'''
print(image)
print('恭喜'+ a +'中奖!')
choujiang('虚竹','萧峰','段誉') # 调用函数