Python项目化教学


项目一、猜大小游戏

  • print (‘’)让程序无需理解,原样输出引号中的内容。

  • print()程序需要读懂括号里的内容(只能读懂数字和变量、以及运算符)。

我们先试试在控制台打印你好

# 这段程序会报错
print(你好)

注: #后面的东西都会变成注释,相当于告诉python,#后面的这一段文字是给程序员自己看的,不要把它当作是程序去运行。

因为python并不知道你好是什么东西,它会把你好当作是一个变量,但是发现没有这个变量,所以它就开始抱怨了(name ‘你好’ is not defined),意思是你好这个变量你没有定义过,我也不知道是啥,我没有办法给你打印。

至于变量是什么东西,我后面告诉你们。

那我们现就让python打印’你好’两个字,我们希望python也别问你好是什么东西了,别试着去理解,直接给我打印就完事了,那你加上单引号就可以。

print('你好')

如果是数字,python是能够理解的,可以不加引号,但是你说你要打印‘鸡泥钛镁’,鬼知道是什么东西(反正我都不懂,更别说python了),麻烦加上引号,否则程序理解不了肯定给你报错。

print(123)

另外表达式python也是直接能够理解的,什么叫表达式呢?比如3+2就是一个表达式,其中+号称为运算符,之后都会学的。

试一试,看看打印出来的结果是什么

print(3+2)

作业:

  1. 在控制台打印你喜欢的运动(或者人)

  2. 在控制台打印520

  3. 用python打印出520-99的结果(不要自己去计算,让程序计算)

  4. 在控制台打印student

扩展(自学)

(用的不多,所以了解)

如果要换行打印怎么办呢?试一试下面的代码。

print('老板、来两斤瓜')
print('对了,老板,你这瓜')
print('保熟吗?')

因为每一个print()执行完成之后默认会输出一个换行。

你如果觉得写这么多print()太累,那我可以再告诉你一种方法

用三引号包裹的字符串是可以换行的。

print('''老板、来两斤瓜,
对了,老板,你这瓜,
保熟吗?
''')

有同学说,我就多写几个print就行了,我不嫌麻烦,我懒得学习三引号的这种方法

那我就布置一个任务给你

任务:用python打印一只猫

看到这个作业是不是有点懵,开玩笑的,我提供代码给你们,你们运行之后感受一下吧

print("""
      /\_/\  
     ( o.o ) 
      > ^ <
    /     \
   /       \
  |         |
   \       /
    \_____/
      |   |
      |___|
""")

在这个任务中,应该能明白吧,这里用三引号会方便很多,每个知识点都是有它存在的意义的,不会白学的。

数据类型

在python中,数据类型分为整数int、浮点数float、字符串str

整数应该好理解,56就是一个整数

带小数点的数字就是浮点数,23.4就是一个浮点数

带引号的就是字符串,’hello’就是一个字符串

如果你实在判断不出来,可以用type()函数来判断数据类型,但是注意,判断完了之后,必须要打印出来我们才看得见

# int
print(type(56))
# float
print(type(23.4))
# str
print(type('hello'))			

课堂作业:

用python分别打印66、66.0、六六的类型(注意字符串要加引号)

变量

概念

假如你去了一趟超市,买了很多你喜欢吃的东西回来,有瓜子,有糖,有水果,你没有办法马上全部吃完,你希望能找一些盒子先放起来,等到先吃的时候再吃。但是为了防止我们想吃的时候找不到会饿死,你得找很多标签贴在盒子上,然后把瓜子放在瓜子盒里,把糖放在糖盒里,把水果放在水果盒子里。

同样,在Python的世界里,我们经常会接收到各种数据,这些数据需要找盒子来保存起来,保存起来不算完,要用的时候我们还得记得是放在哪个盒子里的。

这些盒子就叫做变量,盒子上的标签纸就叫做变量名。

变量名命名规则

  1. 变量名通常由字母,数字,下划线组成;

  2. 数字不能作为变量名开头;

  3. 不能以python中的关键字命名;

  4. 变量名要有意义;

总结来说,变量里装的是什么东西,变量名就叫什么,一般用英文命名,不会英文就用拼音代替就完事

赋值语句

那怎么把东西放到盒子里呢?那就要通过赋值语句=

注意在python中,=代表赋值而不是等于,==才表示等于的意思

赋值就是把右边的东西装到左边的盒子里。

name = '小王'
print(name)

我把字符串’小王’放到一个名叫name的变量里

想一想,如果依次将两个东西装进同一个’盒子‘里,会怎么样。

name='小王'
name='小明'
print(name)

被多次赋值时,变量只会储存最新一次的赋值。

也就是说,变量是可以重新被赋值的,所以知道为什么要叫做变量了吗?因为变量是可以被改变的

相当于如果盒子里已经有东西了,我想再放一个新的东西,不好意思,一个盒子只能放一个东西,如果你要放新的东西进去,那么之前的东西就没了,这也就是变量值的覆盖。

课堂作业:

  1. 将’张三’放在一个名为student的变量里,然后打印变量的值

  2. 将800放在一个名为money的变量里,然后打印变量的值

上节课不是讲了如何去看数据的类型吗?

我们这次想把数据放到变量里,然后去看变量的类型,其实实际上看的是变量的值的类型

x = 2
y = 1.0
z = '你好世界'
print(type(x))
print(type(y))
print(type(z))

课堂作业

将55,‘55’,55.0分别放在名为a、b、c的变量中,然后查看变量a、b、c的数据类型分别是什么。

扩展知识:

Python语言的特色,不需要类型声明,通过赋值语句,就可以定义变量,变量的类型由赋值的结果决定。😎

input()函数

使用input()可以接受用户的输入,input() 的括号里填写对用户的提示。

当然,你接收的用户输入数据一定要找个地方放起来,还记得我们刚才学过的变量吗?我们需要将input()接收到的用户输入数据通过赋值语句放到变量中。

再举个通俗一点的列子,你爸说:“小明啊,你这次考试考得不错,我给了买了目前最快的显卡”,但是你说:“好的,我收到了,但是我没地儿放了”,那你爸只能将显卡扔了。所以数据如果不保存在变量中,就会丢失。

guess_number = input('请输入0到100之间的整数:')
 
print(guess_number)

课堂作业:

通过刚才学习的type()函数,看一下上述代码中,guess_number变量的值是什么类型?

注意:

通过input接收的数据,都是字符串类型。

字符串拼接

字符串可以通过+号连接起来。

name = input('请输入你的名字:')
print('你好!'+ name)

课堂作业:

礼貌询问用户的名字,打印出“欢迎来到酒馆,XXX(用户的名字),请问要买点什么?”

数据类型转换

  • str()将其他类型转换为字符串。

  • int()将其他类型转换为整型。

  • float()将其他类型转换为浮点数

str()

qian = 500
# 看一下qian是什么类型的
print(type(qian))
# 将qian的类型转换为字符串,转换完了之后记得再放回原变量
qian = str(qian)
# 再看看qian是什么类型的
print(type(qian))

int()

qian = '500'
# 看一下qian是什么类型的
print(type(qian))
# 将qian的类型转换为整数,转换完了之后记得再放回原变量
qian = int(qian)
# 再看看qian是什么类型的
print(type(qian))

注意:

只有内容是整数或浮点数的字符串,才可以被强制转换为整数或浮点数。

试一试,以下代码会报错

print(int('你好世界'))

浮点数强制转换为整数时,会直接丢掉小数部分,不是四舍五入。

print(int(6.8))

课堂作业:

  1. 请用户输入他的年龄,把用户输入的数据转换为整数类型之后,再存入age变量。
  2. 补全代码
    name1 = '张三'
    action = 520
    name2 = '李四'
    # 要求用字符串的拼接实现,打印出张三520李四
    print(name1 + )

运算符

算术运算符

算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等

运算符 作用
+ 求和
- 求差
* 求积
/ 求商
% 取模(取余数),开发中经常用于作为某个数字是否被整除

案列:将用户输入的摄氏温度转换为华氏温度(公式f = 9 / 5 * c + 32,f是华氏温度,c是摄氏温度)

c = float(input('请输入华氏摄氏度:')) 
f = 9 / 5 * c + 32
print('转换为摄氏度是:' + str(f))

课堂练习:

  1. 请用户输入自己有多少岁,然后我们帮其计算出他已经出生了多少天。(一年就当作365天)

  2. BMI计算器

收集用户的体重和身高,然后计算出BMI值

BMI值的计算公式为:BMI=体重(公斤)除以身高(米)的平方

赋值运算符

运算符 作用
+= 加法赋值
-+ 减法赋值
*= 乘法赋值
/= 除法赋值
%= 取余赋值
a = 3
a = a + 5
print(a)

# 用赋值运算符实现
a = 3
a += 5
print(a)

比较运算符

使用场景:比较两个数据大小、是否相等,根据比较结果返回一个布尔值(True / False)

运算符 作用
> 左边是否大于右边
< 左边是否小于右边
>= 左边是否大于或等于右边
<= 左边是否小于或等于右边
== 左右两边是否相等
!= 左右值是否不相等

练习:判断以下比较运算之后的结果

a = 2

print(a > 5) 
print(a >= 2) 
print(a == 2)
print(a != 2)

逻辑运算符

使用场景:可以把多个布尔值放到一起运算,最终返回一个布尔值

符号 名称 日常读法 特点 口诀
and 逻辑与 并且 符号两边有一个假的结果为假 同真为真,一假则假
or 逻辑或 或者 符号两边有一个真的结果为真 同假为假,一真则真
not 逻辑非 取反 true变false false变true 真变假,假变真
A B A && B A || B !A
false false false false true
false true false true true
true false false true false
true true true true false

逻辑运算符优先级: not> and > or

条件判断语句

单分支

如果条件成立的话,执行以下代码,否则执行另外的代码

所以条件判断语句也被称为分支语句

score = input('请输入你这次Python考了多少分(0-100):')
 
if score >= 60:
    print('你及格了')
else:  
    print('唉,得加油了')

思考:

上面的程序为什么会报错,应该怎么修改。

提示:字符串不可以和数字进行比较,除非你把字符串转换为数字类型

课堂作业:

  1. 询问用户的年龄和姓名,如果年龄小于10,打印欢迎你小孩哥xxx,如果年龄是10-20岁,打印欢迎你小兄弟xxx,如果年龄大于20,打印欢迎你小老哥xxx。

提示:年龄是做判断的条件,应该是整数类型,姓名是用来拼接的,应该是字符串类型。

逻辑运算

在做条件判断的时候,往往会用到逻辑运算符

案例一:

让用户输入用户名和密码,如果用户名和密码同时都对(正确的账号是zhangsan,密码:123456),那么就提示用户登录成功

username = input('请输入用户名:')
password = input('请输入密码:')

if username=='zhangsan' and password=='123456':
    print('密码正确')
else:
    print('密码错误')

and就是逻辑运算符,表示左右两边的条件都满足才行,口诀同真为真,一假则假,能理解一点了吗?

现在应该再写一个或的逻辑运算了,我想了下,这个机会还是让你们自己探索比较好,或的逻辑是同假为假,一真则真,就是两个条件中有一个为真就可以了。

练习:

小明开发了一个婚恋网站,但是总是接到用户的投诉,说是总有一些不男不女的人,甚至发一些辣眼睛的照片,对正常用户的使用造成了很大的影响,所以小明需要用户在使用前填写自己的性别,如果性别为男或者女,打印“你符合本网站的条件,欢迎体验”,否则打印“尊敬的用户,实在抱歉,不男不女的人妖变态没有资格使用我们的网站,为您带来不便敬请谅解”。

多分支

如果有多个条件怎么办呢?

第一种方法:用很多个if(不推荐)

score = int(input('请输入你这次Python考了多少分(0-100):'))
 
if score >= 90:
    print('不错,很优秀')
if 90 > score >= 60:
	print('还行吧,马马虎虎')
if score < 60:  
    print('唉,得加油了')

第二种方式:用多分支条件判断(推荐)

score = int(input('请输入你这次Python考了多少分(0-100):'))
 
if score >= 90:
    print('不错,很优秀')
elif score >= 60:
	print('还行吧,马马虎虎')
else:  
    print('唉,得加油了')

任务:请完善之前的BMI计算器,新增一个温馨小提示,胖了提醒用户太胖了,瘦了提醒用户太瘦了

根据BMI值的计算结果,人们被划分为不同的体重分类。体重分类标准如下:BMI值小于18.5,为过轻;BMI值介于18.5至24.9,为正常体重;BMI值大于25至29.9,为超重;BMI值大于或等于30,为肥胖

BMI值的计算公式为:BMI=体重(公斤)除以身高(米)的平方

while循环

语法:

while 条件:
    当条件满足时,执行循环体内的程序

在运行之前,前自己演算一下运行的结果应该是多少

a = 0
while a < 5:
    a = a + 1
    print(a)

循环三要素:

1.初始值 (经常用变量)

2.终止条件

3.变量的变化量

练习:吴亦凡在进去之前有很多忠实的铁粉,他们很想念吴亦凡,甚至提出想到监狱里去陪吴亦凡(但是不清楚后面怎么没人去),所以请用程序实现,在页面上输出“想念凡凡的第1天”,一直到“想念凡凡的第100天”,最后打印“凡凡,你在里面好好改造,争取早日重新做人”。(真实社会事件,吴亦凡的粉丝在吴亦凡被羁押期间一直为吴亦凡声援,但是吴亦凡进去之后就没声了,她们的沉默让凡凡很受伤)

for..in..循环

for in 循环可以理解为,一堆人去排队,有多少人就要排多少次,也就是循环多少次

所有for循环的循环次数是确定的

以下是用一个列表是排队,列表中有三个元素,自然是循环3次,i就是这一次排队排到的元素,小明在最前面,第一次当然是小明,第二次是小红,第三次是小王,你打印出来的顺序是这样的吗?

for i in ['小明','小红','小王']:
   print(i)

也可以使用range函数来产生一系列数字:

# 注意是从零开始,往后生成5个数,即0-4
for i in range(5):
    print(i)
# 等同于
for i in [0,1,2,3,4]:
    print(i)

如果你不想从零开始生成,也可以这样写

# 左包右不包原则,即10-13
for i in range(10,14):
    print(i)

另外还可以设置步长,步长默认是1,你也可以改,第三个参数就是设置步长

你就想象一个人走楼梯,正常都是一次走一个楼梯,但是有的人步子要长一些,他可以第一次走五个楼梯,左脚踩在第一个台阶上,往后推五个台阶,右脚就直接踏上第六个台阶。

# 设置步长为5
for i in range(0,20,5):
    print(i)

你甚至可以反正走

# 从20-0反着走
for i in range(20,0,-1):
    print(i)

练习:用range()函数结合for循环实现,

  1. 打印1-100所有的整数

  2. 打印从0-100所有的奇数

  3. 打印从0-100所有的偶数

  4. 打印10,7,4,1

循环控制

  • break 跳出全部循环
  • continue 跳出本次循环

break

如果条件是True,表示循环条件一直成立,这做用法一定要小心,很容易出现死循环,造成程序崩溃,这种用法一般搭配循环控制语句来使用

while True:
    password = input('请输入密码')
    if password == '8888':
        print('密码正确')
        break
	else:
		print('密码错误')

拓展:另一种写法,不用循环控制语句。

password = ''
while password!='8888':
    password=input('请输入密码')
print('密码正确')

是不是要难以理解一点,我们写程序能简单就简单一点,要符合正常人的思维,不需要写得很复杂让别人看不懂,来显得自己很牛,在工作上没有人愿意和这样的人搭档。

任务:询问用户:“如果我是程序员,你会爱我吗?”

  1. 如果用户输入的是 ‘爱’,则打印“我就知道你是爱我的”,并退出程序
  2. 否则一直询问,直到天荒地老

continue

案例:打印1-30,但是不要打印7

for i in range(0,31):
    if i == 7:
        continue
    print(i)

练习:

打印1-30,但是不要打印7以及7的倍数

提示:如果i余7为0(i%7 == 0),表示i能够被7整除(没有余数就是整除),那么i就是7的倍数

模块的引用

在完成项目之前,我们还差最后一个东西,就是如果产生随机数,产生随机数需要使用random库,使用前需要先引入。

其实你就理解为一个工具箱就可以了,这个工具箱中存放的全是和随机相关的工具,我们要用的就是random.randint()(产生随机整数)工具,你还需要告诉它,你要产生多少到多少的随机数(左包右也包)。

import 模块名

import random
 
random_number = random.randint(1, 99)
print(random_number)

import 模块名 as 别名

另外,还可以给模块名取别名

import random as r
 
random_number = r.randint(1, 99)
print(random_number)

注意,内置库可以直接引用,如果是第三方库需要先安装,安装方法为:win+r,cmd,pip install 模块名。😎

异常处理(扩展)

在我们的项目中,如果用户输入的不是数字,会发生什么错误,应该怎么解决呢?

这个时候我们可以采用异常处理的判断,因为这是我们写的第一个程序,我不想弄得太复杂,这一部分内容作为扩展,你愿意尝试就自己尝试吧,我就不讲了,大家都相信用户会输入数字的吧。

try:
  #尝试执行这段代码
except:
  #如果出错就执行这段代码,否则不执行

项目实践

基础的知识我全部讲完了,现在该你们去完成项目了

无非就是讲上面讲的知识综合应用起来,说起来容易,做起来难,每个知识点都弄懂了,不代表你能够去完成实际的项目,这也是项目教学的特点,培养你们综合运行知识解决实际需求的能力。

项目需求:

计算机随机产生一个0-100的数(别让用户看到),用户输入一个数,如果比随机数大,则提示用户“大了”,否则提示用户“小了”,直到用户猜对,打印“恭喜你猜对了”,程序结束。

项目二、剪刀石头布游戏

概念

这个案例主要是带大家学习列表相关的知识

之前学习了三种基本数据类型,整数浮点数字符串

如果使用基本数据类型,用起来确实简单,就像一个装东西的盒子一样,往里面放东西,取东西。

但是如果我有一堆东西,那我就需要一堆变量来存放,太麻烦了,所以这种情况就要使用列表

如果你去找老中医抓过药,你应该就看到过,所有的中药都是放在一个柜子里面,这个柜子有上百个抽屉

老中医开好单子之后,就从会这个柜子里熟练打开各种柜子抓中药,这个柜子就是列表,每一个抽屉就是列表中的元素

列表的使用

1.从列表中提取单个元素

定义一个列表,列表中可以放入各种东西,可以是字符串,整数、浮点数,甚至列表中也可以放入列表,无限套娃

可以通过下标索引从列表中提取元素,注意:下标是从0开始的

list1 = [ '小红' , 2 , 66.0 , [6,8] ]
#           0      1    2       3
print(list1[0])

练习:找到那匹狼

list1 = ['苹果','香蕉',['小狗','小猫','七匹狼','小鸟'],'西瓜']
print(     )

2.从列表中提取多个元素

这个操作也叫列表的切片

语法:

list[start:stop:step]

  • start 是切片起始的索引,默认为 0。
  • stop 是切片结束的索引,默认为列表的长度。
  • step 是切片的步长,默认为 1。

规则:

  1. 左闭右开,就是左边取得到,右边取不到
  2. start 不写时,默认从列表的第一个元素开始,stop 不写时,默认取到列表的最后一个元素
list1 = [0,1,2,3,4]
print(list1[1:3])
print(list1[2:4])
print(list1[2:])
print(list1[:2])
print(list1[:])
print(list1[::2])

注意:列表切片遵循原则:“左包右不包”。

练习:

  1. 对于列表 letters = ['a', 'b', 'c', 'd', 'e'],使用切片获取列表的前 3 个元素和后3个元素
  2. 给定列表 fruits = ["苹果", "香蕉", "雪梨", "橘子"],使用列表切片的方法,打印出香蕉和雪梨。
  3. 已知列表 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],请获取列表中所有偶数
  4. 已知列表 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],请获取列表中所有奇数

3.增加元素

list1 = [0,1,2,3,4]
list1.append(5)
print(list1)

练习:

随机生成20位学生的成绩,保存在列表中,成绩范围在0~100分内。

import random

list_score = []

fenshu = random.randint(0,100)
# 剩下的你来写

4.删除元素

pop() 方法会移除并返回列表中指定索引位置的元素

若不指定索引,默认移除并返回列表的最后一个元素

list1 = ['小红','小明','小刚']
list1.pop(1)
print(list1)

5.改变列表中的元素

list1 = [1,2,3,4]
list1[1] = '小明'
print(list1)

案例:

期中考试结束了,很多同学的成绩是不及格的,请你用python实现,将所以低于60分的成绩都改为60分

list_score = [92, 53, 38, 91]

作业:

我现在加大了数据量,又该如何面对?

list_score = [92, 53, 38, 91, 96, 89, 22, 54, 81, 75, 100, 60, 92, 72, 12, 24, 37, 4, 85, 33]

6.获取列表元素的索引

list1 = ['小明','小红','小孩']
print(list1.index('小红'))

7.in和not in

list = [1,2,3,4,5]
a = 1
 
print(a in list)
print(a not in list)

补充:常用内置函数

1.len()

len()函数可以返回对象的长度,可以用于多种数据类型。

list1 = [1,2,3]
# 计算数组的长度
print(len(list1))

name = '张三'
# 计算字符串的长度
print(len(name))

2.max()

max()函数返回数组的最大值

list1 = [1,2,3]

print(max(list1))

3.min()

min()函数返回数组的最小值

list1 = [1,2,3]

print(min(list1))

4.sum()

sum()函数返回数组的和

list1 = [1,2,3]

print(sum(list1))

练习:

随机生成20位学生的成绩,保存在列表中,成绩范围在0~100分内。并求平均分数、最高分、最低分、优秀人数,90分以上为优秀。

实现剪刀石头布游戏

1.计算机出拳

计算机应该随机选择“剪刀”,“石头”,“布”

random.choice()从非空的序列里随机挑选一个元素

import random
 
choice_list = ['石头','剪刀','布']
computer_choice = random.choice(choice_list)
print('计算机出拳:',computer_choice)

2.用户出拳

user_choice = input('请出拳(石头、剪刀、布):')  # 请用户输入选择
print('用户出拳:',user_choice)
if user_choice not in choice_list:
    print('输入有误,请重新出拳')

但是这样的话,如果输入错误,用户是没有机会重新出拳的

可以通过循环语句实现,使得用户必须输入正确才能退出循环,否则将会一直卡在这一步。

while True:
    user_choice = input('请出拳(石头、剪刀、布):')  # 请用户输入选择
    print('用户出拳:',user_choice)
    if user_choice not in choice_list:
        print('输入有误,请重新出拳')
    else:
    	break

还有一种方法是这样,这种写法虽然代码量少了,但是不够语义化,不符合正常逻辑,其实不好。

user_choice = ''
while user_choice not in choice_list:
    user_choice = input('请出拳(石头、剪刀、布):')
    print('输入有误,请重新出拳')

3.判断胜负

import random

#计算机出拳
choice_list = ['石头','剪刀','布']
computer_choice = random.choice(choice_list)
print('计算机出拳:',computer_choice)

#用户出拳
while True:
    user_choice = input('请出拳(石头、剪刀、布):')  # 请用户输入选择
    print('用户出拳:',user_choice)
    if user_choice not in choice_list:
        print('输入有误,请重新出拳')
    else:
    	break

#判断胜负
if user_choice == computer_choice:  # 使用if进行条件判断
	print('平局!')
elif (user_choice == '石头' and computer_choice == '剪刀') or(user_choice == '剪刀' and computer_choice == '布') or (user_choice == '布' and computer_choice == '石头'):
	print('你赢了!')
else:
	print('你输了!')

最后还可以让代码更简洁一点

import random

#计算机出拳
choice_list = ['石头','剪刀','布']
computer_choice = random.choice(choice_list)
print('计算机出拳:',computer_choice)

#用户出拳
while True:
    user_choice = input('请出拳(石头、剪刀、布):')  # 请用户输入选择
    print('用户出拳:',user_choice)
    if user_choice not in choice_list:
        print('输入有误,请重新出拳')
    else:
    	break

#判断胜负
if user_choice == computer_choice:  # 使用if进行条件判断
	print('平局!')
elif user_choice == choice_list[choice_list.index(computer_choice)-1]::
	print('你赢了!')
else:
	print('你输了!')

项目三、鱼子酱要买多少

函数

1.函数的定义与参数传递

先来创建一个最基本的函数吧

def study():
    print('我爱学习编程')
 
study()

我们可以传递一些参数进去

def study(name,school):
    print(f'我的名字叫做{name},我在{school}学习编程')
 
study('小明','海盐职教中心')

当然,参数应该按照顺序放进去,不信就试一下下面这段代码。

def study(name,school):
    print(f'我的名字叫做{name},我在{school}学习编程')
 
study('海盐职教中心','小明')

我们也可以对参数进行指定,不按照顺序传递。

def study(name,school):
    print(f'我的名字叫做{name},我在{school}学习编程')
 
study(school='海盐职教中心',name='小明')

还可以给参数设置默认的值

def study(name,school = '海盐职教中心'):
    print(f'我的名字叫做{name},我在{school}学习编程')
 
study(name='小明')

默认参数的值是可以修改的

def study(name,school = '海盐职教中心'):
    print(f'我的名字叫做{name},我在{school}学习编程')
 
study('小明','清华大学')

如果不确定参数的数量,我们可以设置一种特殊的不定长参数。

def study(name,school,*course):
    print(f'我的名字叫做{name},我在{school}学习{course}')
 
study('小明','海盐商贸学校','编程','PS')

这种不定长参数会返回一种元组类型,如果你觉得不好看,我们可以用循环将其依次取出。

def study(name,school,*course):
    for i in course:
        print(f'我的名字叫做{name},我在{school}学习{i}')
 
study('小明','海盐商贸学校','编程','数学')

🐱‍🐉试一试,定义一个函数,要求把第一个参数设置为不定长参数。

看一下prints()函数的文档,第一个参数是不是就是不定长参数

print('我', '正在', '学习编程', sep = '+', end = '\n')
print('我', '正在', '学习编程', sep = '+', end = '\n')

2.函数的返回值

def wage(month):
    if month < 3:
        money = 5000 * month
    else:
        money = 6000 * month
    return money
 
month = int(input('你工作了多少个月:'))
money = wage(month)
print(f"你的工资为{money}")

函数也可以返回多个值,但需要注意,不要依次写多个return,因为遇到第一个return,函数就结束了,后面的程序不会执行。

def wage(month):
    bonus = 1000 * month
    if month < 3:
        money = 5000 * month
    else:
        money = 6000 * month
    return money,bonus

month = int(input('你工作了多少个月:'))
money = wage(month)
print(money)

项目实战

一、任务需求

假设你是联合国主席兼世界首富,想要捐助你的母校海盐商贸学校若干箱鱼子酱,以改善同学们的伙食,但是买得少了不够吃,买得太多吃不完,过了保质期会造成浪费,所以需要一个程序来计算数量,计算方式有两种。

  • 已知每位同学每月能够吃10箱鱼子酱。
  • 计算方式1:时间计算
    🐱‍👤例如输入10000箱鱼子酱、共有100位同学,程序帮我们计算出鱼子酱可以供同学们食用10个月。
  • 计算方式2:人力计算
    🐱‍👤例如输入10000箱鱼子酱,但是保质期只有两个月了,程序帮我们计算出至少需要找500位同学才能按时吃完。

二、初始版本

# 已知每位同学每个月能吃完10箱鱼子酱

# 时间计算、已知有食堂买了多少箱鱼子酱,以及有多少位同学,计算鱼子酱供学生食用多少个月。
def JiSuan_month(yzj_num,student_num):
    month = yzj_num/(student_num*10) 
    print(f"如果食堂采购了{yzj_num}箱鱼子酱,且有{student_num}位同学,那么鱼子酱课供学生食用{month}个月")

# 人力计算、已知有食堂买了多少箱鱼子酱,以及鱼子酱的保质期,计算需要找多少位同学来吃,才能在保质期内按时吃完。
def JiSuan_student_num(yzj_num,month):
    student_num = yzj_num/(month*10)
    print(f"如果食堂采购了{yzj_num}箱鱼子酱,且保质期为{month}个月,至少需要找{student_num}位同学才能按时吃完")

JiSuan_month(10000,200)               #调用时间计算函数
JiSuan_student_num(10000,5)           #调用人力计算函数

三、修复BUG

在使用一段时间之后,我们发现了一个bug,举例来说,当采购了10000箱鱼子酱,保质期为三个月,程序计算出需要至少找333.3个同学来吃才能够按时吃完,我们没有办法去找0.3位同学,所以这个时候可以向上取整。
向上取整我们可以使用math.ceil()函数,使用之前记得import。

#已知每位同学每个月能吃完10箱鱼子酱

import math
#时间计算、已知有食堂买了多少箱鱼子酱,以及有多少位同学,计算鱼子酱供学生食用多少个月。
def JiSuan_month(yzj_num,student_num):
    month = yzj_num/(student_num*10) 
    print(f"如果食堂采购了{yzj_num}箱鱼子酱,且有{student_num}位同学,那么鱼子酱课供学生食用{month}个月")

#人力计算、已知有食堂买了多少箱鱼子酱,以及鱼子酱的保质期,计算需要找多少位同学来吃,才能在保质期内按时吃完。
def JiSuan_student_num(yzj_num,month):
    student_num = math.ceil(yzj_num/(month*10)) 
    print(f"如果食堂采购了{yzj_num}箱鱼子酱,且保质期为{month}个月,至少需要找{student_num}位同学才能按时吃完")

JiSuan_month(10000,200)               #调用时间计算函数
JiSuan_student_num(10000,3)           #调用人力计算函数

四、合并函数

现在程序已经没有BUG了,但是需要分别调用两个函数,比较麻烦,我们能不能想办法把两个函数合并为一个函数呢?

#已知每位同学每个月能吃完10箱鱼子酱

import math

def JiSuan(yzj_num,student_num=None,month=None):
    # 时间计算、已知有食堂买了多少箱鱼子酱,以及有多少位同学,计算鱼子酱供学生食用多少个月。
    if student_num != None and month == None:
        month = yzj_num/(student_num*10) 
        print(f"如果食堂采购了{yzj_num}箱鱼子酱,且有{student_num}位同学,那么鱼子酱课供学生食用{month}个月")
    # 人力计算、已知有食堂买了多少箱鱼子酱,以及鱼子酱的保质期,计算需要找多少位同学来吃,才能在保质期内按时吃完。
    elif student_num == None and month != None:
        student_num = math.ceil(yzj_num/(month*10)) 
        print(f"如果食堂采购了{yzj_num}箱鱼子酱,且保质期为{month}个月,至少需要找{student_num}位同学才能按时吃完")
    else:
        print('函数参数设置有误')

JiSuan(1000,student_num=20)
JiSuan(1000,month=2)
JiSuan(1000)
JiSuan(1000,student_num=20,month=2)

五、增进体验

虽然现在函数的调用变简单了,但是对于用户来说还是太难了,因为这个程序只能是程序员会用,只有程序员才知道函数括号里的参数应该怎么填,应该怎么改。如果我们现在要交付给用户使用,应该如何改进呢?🤷‍♂️

#已知每位同学每个月能吃完10箱鱼子酱
import math

def JiSuan(yzj_num,student_num=None,month=None):
    # 时间计算、已知有食堂买了多少箱鱼子酱,以及有多少位同学,计算鱼子酱供学生食用多少个月。
    if student_num != None and month == None:
        month = yzj_num/(student_num*10) 
        print(f"如果食堂采购了{yzj_num}箱鱼子酱,且有{student_num}位同学,那么鱼子酱课供学生食用{month}个月")
    # 人力计算、已知有食堂买了多少箱鱼子酱,以及鱼子酱的保质期,计算需要找多少位同学来吃,才能在保质期内按时吃完。
    elif student_num == None and month != None:
        student_num = math.ceil(yzj_num/(month*10)) 
        print(f"如果食堂采购了{yzj_num}箱鱼子酱,且保质期为{month}个月,至少需要找{student_num}位同学才能按时吃完")
    else:
        print('函数参数设置有误')

while True:
    user_choice = input('请输入计算的类型(1、时间计算 2、人力计算):')
    yzj_num = int(input('请输入食堂一共采购了多少箱鱼子酱:'))
    if user_choice == '1':
        student_num = int(input('请输入学生的数量:'))
        JiSuan(yzj_num,student_num=student_num)
    elif user_choice == '2':
        month = int(input('请输入鱼子酱的保质期(月):'))
        JiSuan(yzj_num,month=month)
    else:
        print('输入有误,请重新输入')

六、结构化设计

现在用户的确可以使用了,但是对于程序员来说,又不符合程序设计的结构性原则,不仅自己很难维护,别人也很难阅读,我们需要按照逻辑的划分对代码进行封装。

#已知每位同学每个月能吃完10箱鱼子酱
import math

def JiSuan(yzj_num,student_num=None,month=None):
    # 时间计算、已知有食堂买了多少箱鱼子酱,以及有多少位同学,计算鱼子酱供学生食用多少个月。
    if student_num != None and month == None:
        month = yzj_num/(student_num*10) 
        print(f"如果食堂采购了{yzj_num}箱鱼子酱,且有{student_num}位同学,那么鱼子酱课供学生食用{month}个月")
    # 人力计算、已知有食堂买了多少箱鱼子酱,以及鱼子酱的保质期,计算需要找多少位同学来吃,才能在保质期内按时吃完。
    elif student_num == None and month != None:
        student_num = math.ceil(yzj_num/(month*10)) 
        print(f"如果食堂采购了{yzj_num}箱鱼子酱,且保质期为{month}个月,至少需要找{student_num}位同学才能按时吃完")
    else:
        print('函数参数设置有误')

#获取用户输入
def UserInput():
    while True:
        user_choice = input('请输入计算的类型(1、时间计算 2、人力计算):')
        if user_choice == '1':
            yzj_num = int(input('请输入食堂一共采购了多少箱鱼子酱:'))
            student_num = int(input('请输入学生的数量:'))
            month = None
            break
        elif user_choice == '2':
            yzj_num = int(input('请输入食堂一共采购了多少箱鱼子酱:'))
            month = int(input('请输入鱼子酱的保质期(月):'))
            student_num = None
            break
        else:
            print('输入有误,请重新输入')
    return yzj_num,student_num,month

while True:
    user_input = UserInput()
    yzj_num = user_input[0]
    student_num = user_input[1]
    month = user_input[2]
    JiSuan(yzj_num=yzj_num,student_num=student_num,month=month)

大功告成😁😍😁,是不是一个看似很简单的程序,但是程序设计的流程其实是很严谨的,我希望我们可以通过一个简单的程序,去体会程序开发的思想。

项目四、机房管理系统

基础知识

一、类的创建

# 定义"小孩"类
class kid():
    # 属性:爱好是玩
    hobby = '玩'
    
    # 方法:吃饭
    def eatFood(self,food):
        print(f'吃{food}')

xiaoming = kid() # 类的实例化,小明属于“小孩”类,小明就具备“小孩”类中的属性和方法
print(xiaoming.hobby)
xiaoming.eatFood('包子')

这个self是用来做什么的呢?🤦‍♂️

# 定义"小孩"类
class kid():
    # 属性:爱好是玩
    hobby = '玩'
    
    # 方法:吃饭
    def eatFood(self,food):
        print(f'吃{food}')
    
    # 方法:说话(说出自己的爱好)
    def say(self):
        print(f'我的爱好是{self.hobby}')
 
xiaoming = kid() # 类的实例化,小明属于“小孩”类,小明就具备“小孩”类中的属性和方法
print(xiaoming.hobby)
xiaoming.eatFood('包子')
xiaoming.say()

self是在类还没有创建完成的时候,却又想在类的内容调用类属性或其他方法时
就可以用self.属性名或self.方法名调用自身的方法或属性

二、类的初始化

初始化方法的作用在于:当每个实例对象创建时,该方法内的代码无须调用就会自动执行。

# 定义"小孩"类
class kid():

    # 当类实例化的时候自动执行,设置“姓名”属性为小明
    def __init__(self):
        self.name = '小明'

    # 属性:爱好是玩
    hobby = '玩'
    
    # 方法:吃饭
    def eatFood(self,food):
        print(f'吃{food}')
    
    # 方法:说话(说出自己的爱好)
    def say(self):
        print(f'我的爱好是{self.hobby}')
 
xiaoming = kid()
print(xiaoming.name)

当然,初始化方法的正确用法是在类实例化的时候,我们给一些属性设初值。

# 定义"小孩"类
class kid():

    # 当类实例化的时候自动执行,设置“姓名”属性为小明
    def __init__(self,name):
        self.name = name

    # 属性:爱好是玩
    hobby = '玩'
    
    # 方法:吃饭
    def eatFood(self,food):
        print(f'吃{food}')
    
    # 方法:说出自己的爱好
    def say(self):
        print(f'我的爱好是{self.hobby}')
        print(f'我的姓名是{self.name}')
# 实例化对象小明
xiaoming = kid('小明')
print(xiaoming.name)
xiaoming.say()
# 实例化对象小红
xiaohong = kid('小红')
print(xiaoming.name)
xiaoming.say()

三、类的继承与定制

class ball():
    weight = 10
 
    def move(self,speed):
        print('小球移动速度是{}'.format(speed))
 
class new_ball(ball):
    def move(self,speed):
        print('小球移动速度是{}'.format(speed*2))
 
ball_1 = ball()
ball_2 = new_ball()
ball_1.move(10)
ball_2.move(10)

但是这样直接重写父类的方法,如果父类的方法发生变化,子类的方法也得重新修改,不利于我们维护,最好先继承父类的方法,再做修改。

class ball():
    weight = 10
 
    def move(self,speed):
        print('小球移动速度是{}'.format(speed))
 
class new_ball(ball):
 
    def move(self,speed):
        ball.move(self,speed*2)
 
ball_1 = ball()
ball_2 = new_ball()
ball_1.move(10)
ball_2.move(10)

练习一、智能储蓄罐

你有一个智能储蓄罐,该储蓄罐安装了高级人工智能芯片,会做四件事。
一是可以查询余额 (假设你是一个中东土豪,在对象实例化时,你已经在该储蓄罐已经存了100元)
二是可以存钱
三是可以取钱
四是可以换算美元汇率,1美元=6.3717人民币

# 定义"智能存钱罐"类
class moneyBox():
    
    # 初始化函数,类实例化的时候自动调用
    def __init__(self,money):
        self.money = money

    # 菜单
    def menu(self):
        print('欢迎使用智能存钱罐')
        while True:
            user_choice = input('请选择功能(1、查询余额 2、存钱 3、取钱 4、换算美元 5、退出):')
            if user_choice == '1':
                self.showMoney()
            elif user_choice == '2':
                self.saveMoney()
            elif user_choice == '3':
                self.drawMoney()
            elif user_choice == '4':
                self.exchangeRate()
            elif user_choice == '5':
                print('谢谢您的使用,下次记得多来存点钱啊')
                break

    # 展示余额    
    def showMoney(self):
        print(f'你现在一共存了{self.money}元')
    
    # 存钱
    def saveMoney(self):
        money = int(input('请输入你要存多少钱:'))
        self.money = self.money + money
        print(f'你现在一共存了{self.money}元')

    # 取钱
    def drawMoney(self):
        money = int(input('请输入你要取多少钱:'))
        if self.money < money:
            print('抱歉,您太穷了,您没有那么多钱')
            return False
        self.money = self.money - money
        print(f'你现在一共存了{self.money}元')

    # 汇率换算
    def exchangeRate(self):
        dollar = round(self.money/6.3717,2)  # round(x,y) 对x的前y位四舍五入取整
        print(f'换算成美元是{dollar}$')
        
my_moneyBox = moneyBox(100)
my_moneyBox.menu()
input('按下任意键退出程序')

练习二、智能点菜机器人

练习:

'''
项目需求:
你是一名享誉全球的考古学家,在三星堆的发掘作业中,
你发现了一个奇怪的机器,经过研究,这是距今23亿万年前的亚特兰蒂斯文明所遗留的科技。
那时的人类已经可以实现自动点菜的功能了,这无疑是一项颠覆世界的发现。
但因年代久远,丢失了一些代码片段,你同时作为中职Python首席科学家,需要补全代码
'''

# 定义“菜”类
class dish():

    # 每道菜有两个属性、菜的名字和价格,每道菜的这两个属性各不相同
    def __init__(self,name,price):
        self.name = name 
        self.price = price

    # 每道菜具有相同的方法、如你所见,即展示自己的菜名和价格,
    # 因为它已经是一个成熟的“菜”类了,要学会自己介绍自己
    def show_info(self):
        print(f'菜名:{self.name},价格{self.price}元') 

# 定义“智能点菜机器人”类
class orderMachine():

    # 类初始化时,我们希望他有一个初始的菜单,dish_list里管理的应该是“菜”类的实例化对象
    def __init__(self,dish_list):
        self.dish_list = dish_list
        # 用户点的菜,这个玩意不需要实例化的时候从外面传,因为这个得靠用户自己点,总不能还没点就有东西吧
        self.user_order_list = []  

    # 操作菜单(5分)
    def menu(self):
        print('今年是超新星纪元305年,欢迎使用亚特兰蒂斯点菜系统:')
        while True:
            user_input = input('请选择:1、查看菜单 2、增加菜单 3、点菜 4、退出系统:')
            # 记得看演示程序运行的效果,然后补全
    
    # 查看菜单(5分)
    def show_menu(self):
    # 记得看演示程序运行的效果,然后补全
    	if user_input == '1':
            self.show_menu()
    
    # 增加菜单(5分)
    # 此功能最好需要输入密码才可以使用,否则用户万一捣乱,往菜单里添加一个“稀饭煮翔”,岂不糟糕?
    def add_dish(self):
    # 记得看演示程序运行的效果,然后补全

    # 点菜(5分)
    # 消费 100 元及以上享受 8 折优惠,100 元以下享受每满 10 减 1 优惠”的活动(5分)
    def order_dish(self):
    # 记得看演示程序运行的效果,然后补全
        
# “菜”类的实例化
dish1 = dish('红烧排骨',46)
dish2 = dish('香炸刀鱼',45)
dish3 = dish('虾仁炒蛋',68)
dish_list = [dish1,dish2,dish3]
# “智能点菜机器人”类的实例化
my_orderMachine = orderMachine(dish_list)
my_orderMachine.menu()

练习三、机房管理系统

一、定义“房间”类

“房间”类就两个属性,房间号和房间名

class room():
    def __init__(self,number,name):
        self.number = number
        self.name = name
 
Room203 = room(203,'网络综合布线工作室') # 实例化对象

print(Room203.number)
print(Room203.name)

二、定义“机房管理系统”类

class room():
    def __init__(self,number,name):
        self.number = number
        self.name = name
 
class system():
    # 菜单
    def menu(self):
        print('欢迎使用海盐商贸学校机房管理系统!!!')
        while True:
            choice = input('请选择(1、查看所有机房2、增加机房3、借用机房4、归还机房5、退出):')
            if choice == '1':
                self.showAllRoom()
            elif choice == '2':
                self.addRoom()
            elif choice == '3':
                self.borrowRoom()
            elif choice == '4':
                self.returnRoom()
            elif choice == '5':
                break

HaiYanSystem = system()
HaiYanSystem.menu()

三、查看所有机房

class room():
    # state为借出状态,默认未借出
    def __init__(self,number,name,state = 0):
        self.number = number
        self.name = name
        self.state = state
    
    def __str__(self):
        if self.state == 0:
            state_text = '未借用'
        else:
            state_text = '已借用'
        return '机房房间号{},机房名字{},机房借用状态{}'.format(self.number,self.name,state_text)
 
class system():

    def __init__(self) -> None:
        Room203 = room('203','网络综合布线工作室')
        Room204 = room('204','网络搭建机房')
        Room305 = room('305','Python学习机房')
        self.Room_list = [Room203,Room204,Room305]
    
    # 菜单
    def menu(self):
        print('欢迎使用海盐商贸学校机房管理系统!!!')
        while True:
            choice = input('请选择(1、查看所有机房2、增加机房3、借用机房4、归还机房5、退出):')
            if choice == '1':
                self.showAllRoom()
            elif choice == '2':
                self.addRoom()
            elif choice == '3':
                self.borrowRoom()
            elif choice == '4':
                self.returnRoom()
            elif choice == '5':
                break

    #查看所有机房
    def showAllRoom(self):
        for Room in self.Room_list:
            print(Room)

HaiYanSystem = system()
HaiYanSystem.menu()

四、增加机房

#增加机房
def addRoom(self):
    number = input('请输入房间号:')
    name = input('请输入机房名:')
    new_room = room(number,name)
    self.Room_list.append(new_room)

五、借用机房

#借用机房
def borrowRoom(self):
    number = input('请输入你要借用的机房房间号:')
    for room in self.Room_list:
        if room.number == number:
            if room.state == 0:
                print('成功借用机房')
                room.state = 1
            else:
                print('该机房已被借用')
            break
    else:
        print('没有该机房')

六、归还机房

#归还机房
def returnRoom(self):
    number = input('请输入你要归还的机房房间号:')
    for room in self.Room_list:
        if room.number == number:
            if room.state == 1:
                print('成功归还机房')
                room.state = 0
            else:
                print('该机房没被借用')
            break
    else:
        print('没有该机房')

文章作者: 彭韦浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭韦浩 !
  目录