文章目录
- 0.改进小游戏
- 1.数据类型——数字类型
- 2.数字运算
- 3.数据类型——布尔类型
- 4.逻辑运算符
- 5.运算符优先级
- 6.课后作业
-
- 0.请问以下代码会打印多少次“我爱鱼C!”
- 1. 请问以下代码会打印多少次“我爱鱼C!”
- 2.请写出与 10 < cost < 50 等价的表达式
- 3.Python3 中,一行可以书写多个语句吗?
- 4.Python3 中,一个语句可以分成多行书写吗?
- 5.请问Python的 and 操作符 和C语言的 && 操作符 有何不同?【该题针对有C或C++基础的朋友】
- 6.听说过“短路逻辑(short-circuit logic)”吗?
- 7.尝试写代码实现以下截图功能:
- 8. 尝试写代码实现以下截图功能:
- 9.你知道为什么布尔类型(bool)的 True 和 False 分别用 1 和 0 来代替吗?
- 10. 使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢?
- 11. 我们人类思维是习惯于“四舍五入”法,你有什么办法使得 int() 按照“四舍五入”的方式取整吗?
- 12.取得一个变量的类型,可以使用 type() 和 isinstance(),你更倾向于使用哪个?
- 13.Python3 可以给变量命名中文名,知道为什么吗?
- 14.写一个程序,判断给定年份是否为闰年。
- 15. Python 的 floor 除法使用 “//” 实现,那 3.0 // 2.0 会显示什么内容呢?
- 16.不使用 IDLE,你可以轻松说出 5 \** -2 的值吗?那3 \** 2 \** 3呢?
- 17.还记得我们上节课那个求闰年的作业吗?如果还没有学到“求余”操作,还记得用什么方法可以“委曲求全”代替“%”的功能呢?
- 18.请写一个程序打印出 0~100 所有的奇数。
- 19.爱因斯坦的难题。
- 7.再次改进小游戏
0.改进小游戏
第一个小游戏初始代码:
"""第一个小游戏:猜数字"""
temp = input("不妨猜一下小甲鱼现在心里想的是哪一个数字:")
guess = int(temp)
if guess == 8 :
print("你是小甲鱼心里的蛔虫!")
print("哼,猜中了也没有奖励")
else:
print("对不起,猜错啦,小甲鱼现在心里想的是8")
print("不玩啦,游戏结束")
改进游戏:
要求:
- 当用户猜错时,应该给出相应提示大了或者小了
- 应该提供多次机会给用户
- 每次运行程序,答案应该是随机的
改进后的小游戏代码:
'''改进第一个游戏'''
import random # 引入random模块
count = 3
answer = random.randint(1, 10) # 生成1-10的伪随机数
while count > 0: #进入
temp = input("不妨猜一下小甲鱼现在心里想的是哪一个数字(还有{}次机会):".format(count)) #使用字符串格式或连接使count成为一个参数,guess()函数和print()不一样,不能直接使用拼接
guess = int(temp)
if guess == answer:
print("你是小甲鱼心里的蛔虫!")
print("哼,猜中了也没有奖励")
break # 跳出当前循环(仅跳出一层循环)
else:
if guess < answer:
print("小啦!")
else:
print("大啦!")
count = count - 1
print("不玩啦,游戏结束!")
再次改进代码,不用break:
import random
answer = random.randint(1, 10)
# 这里先给guess附赋一个值,一个绝对不等于answer的值
guess = 0
count = 3
print("不妨猜一猜小甲鱼现在心里想的是哪一个数字:", end="")
while guess != answer and count > 0:
guess = int(input())
count = count - 1 #用户每输入一次,机会就-1
if guess == answer :
print("你是小甲鱼心里的蛔虫!")
print("哼,猜中了也没有奖励")
else:
if guess < answer :
print("小啦!")
else:
print("大啦!")
if count > 0: # 猜错后判断当前是否还有机会
print("再试一次吧:", end="")
else:
print("机会用光咯T_T")
print("不玩啦,游戏结束!")
1.数据类型——数字类型
数字类型:整数、浮点数、复数
0.整数
即1、2、3、4、5…之类的整数,其长度是不受限制的,即其有无限大的精度,可以方便地进行大数运算
1.浮点数
即小数,但是需要注意的是:由于其采用IEE754标准来存储浮点数,所以是有一定精度上的误差的 。比如如下例子:
所以直接使用浮点数进行比较要特别注意,可能会出现如下情况:
对于如何精确地计算浮点数,可以使用decimal模块:
如法炮制,创建变量c,之后再进行比较,即可得到相等!
插曲:E记法(即科学计数法),如下图5e-05就是5*10^-5
2.复数
复数包含一个实部和一个虚部。
2.数字运算
其中,需要注意的是:
- x // y :向下取整(地板除),是取比正常除法所得结果小的最大整数。
- 内置函数abs(x):取绝对值,如果x为复数,则结果为复数的模。
- 内置函数int(x):将x转换为整数,如果传入的x为浮点数,则是只截取整数部分;传入x为字符串,则只能传入包含的是整数的字符串。
- 内置函数float(x):将x转换为浮点数
- complex(re, im):返回一个复数,re是实部,im是虚部,也可以传入字符串,不过+左右不能由空格。
- pow(x, y)的运算结果通常与x ** y是一样的,都是求幂。但是pow(x, y)还支持第三个函数,即pow(x, y, z),是x^y%z。
3.数据类型——布尔类型
布尔类型只有两个值就是True和False。
补充:在Python中,布尔类型就是特殊的整数类型,可以用1代替True,0代替False,如下:
4.逻辑运算符
0.真值测试
Python中任何对象都能直接进行真值测试(测试该对象的布尔类型值为True或者False【使用bool()函数】,用于if或者while语句的条件判断,也可以作为逻辑运算符的操作数。
只有以下内容的真值测试内容是False:
1)定义为False的对象:False, None
2)值为0的数字类型:0, 0.0, 0j,Decimal(0), Fraction(0,1)
3)空的序列和集合:‘’‘’, ‘’, ‘’‘’‘’, (), [], {},set(), range(0)
注:Fraction(0,1)是分子为0,分母为1的有理数。
其他都是当做真!
有图有真相:
1.and和or运算符的短路逻辑(具体见后面)课后作业T5、6
例子:
5.运算符优先级
上题去掉括号后:
如果是从左往右运算的话,答案应该是3呀,但是为啥是4呢?
运算符的运算是有优先级的,具体如下表格(1是优先级最小的,17是最大的):
由上可知:not or and 的优先级是不同的:not > and > or,所以实际运算顺序,刚好就是像上题加了括号后一样的,所以答案也是4。
再举几个例子:
所以在运算时要考虑优先级,如果不确定就加上(),这样就不用考虑优先级啦!
6.课后作业
0.请问以下代码会打印多少次“我爱鱼C!”
while 'C':
print('我爱鱼C!')
答:无数次,是个死循环,原因是 while 后边的条件永远为真(True)。
==注意:==在 Python 看来,只有以下内容会被看作假(注意冒号括号里边啥都没有,连空格都不要有!):False None 0 0.0 0j Decimal(0) Fraction(0,1) ‘’‘’ ‘’ ‘’‘’‘’ () [] {} set() range(0) ,其他一切都被解释为真!
1. 请问以下代码会打印多少次“我爱鱼C!”
i = 10
while i:
print('我爱鱼C!')
i = i - 1
答:10次。
2.请写出与 10 < cost < 50 等价的表达式
答:(cost > 10) and (cost < 50)
3.Python3 中,一行可以书写多个语句吗?
可以,如下(语句之间用分号隔开):
4.Python3 中,一个语句可以分成多行书写吗?
可以,一行过长的语句可以使用反斜杠或者括号分解成几行:
5.请问Python的 and 操作符 和C语言的 && 操作符 有何不同?【该题针对有C或C++基础的朋友】
相同点:
1)and和&&连接的表达式需要同时为真,结果才是真;否则得到的结果就为假。
2)都具有短路逻辑,即当连接多个表达式时只需计算必须要计算的值。可以这么理解,就是expr1 and expr2,如果表达式expr1的值为假,那么后面的表达式expr2不会被计算到,这个表达式的内容直接为假。如果expr1为真,那么会继续判断后面的expr2是否为真,如果为真,那么表达式为真。
不同点:
在C语言中,&&对于结果为真则返回1,对于结果为假则返回0。
比如:1 && 3 = 1,1 && 0 =0;
而在Python中,and并不一定会返回True或者False,而是得到最后一个表达式的值。(同样也应用与or上)
比如:1 and 3 = 3,3 and 1 = 1,1 && 0 =0,True and False = False,False and True = False。
6.听说过“短路逻辑(short-circuit logic)”吗?
答:上题5已经说过。 就是说逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。(即从左往右,只有当第一个操作数的值无法确定逻辑运算的结果时,才对第二个操作数进行求值。)
举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。 这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation),这种行为同样也应用于 or 操作符。实际上,Python 的做法是如果 x 为假,表达式会返回 x的值,否则它就会返回 y 的值(例子参考楼上那题)。
7.尝试写代码实现以下截图功能:
代码:
'''while循环'''
number = int(input("请输入一个整数:"))
if number == 0:
print(0)
elif number > 0:
i = 1
while i <= number:
print(i)
i = i + 1
else:
i = -1
while i >= number:
print(i)
i = i - 1
'''for循环'''
number = int(input("请输入一个整数:"))
if number == 0:
print(0)
elif number > 0:
for i in range(1, number + 1):
print(i)
else:
for i in range(number, 0):
print(number - i - 1)
8. 尝试写代码实现以下截图功能:
'''while循环'''
number = int(input("请输入一个整数:"))
if number <= 0:
print("请输入大于0的整数!")
else:
while number > 0:
print(" " * (number - 1), end="")
print("*" * number)
number = number - 1
'''for循环'''
number = int(input("请输入一个整数:"))
if number <= 0:
print("请输入大于0的整数!")
else:
for i in range(number, 0, -1): #第三个参数表示,以-1为增量值【即递减1】,不加的话默认以1递增。
print(" " * (i - 1), end="")
print("*" * i)
9.你知道为什么布尔类型(bool)的 True 和 False 分别用 1 和 0 来代替吗?
答:因为计算机只能识别二进制数,所以所有的编程语言最终都会转换成简单的二进制序列给 CPU 按照一定的规则解析。 由于二进制只有两个数:0和 1,因此用 0 和 1 来表示 False 和 True 再适合不过了,因为不用浪费资源在转换的过程上。
10. 使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢?
答:无论是正小数还是负小数,都是直接将小数点后的部分截断对于正小数,比如3.4,则int(3.4)==3,就是向下取整;对于负小数,比如-3.4,则int(-3.4)==-3,就是向上取整。
有图有真相:
11. 我们人类思维是习惯于“四舍五入”法,你有什么办法使得 int() 按照“四舍五入”的方式取整吗?
答:将需要“四舍五入取整”的数据加上0.5就行。
如下所示:
12.取得一个变量的类型,可以使用 type() 和 isinstance(),你更倾向于使用哪个?
答:建议使用 isinstance(),因为它的返回结果比较直接True/False,另外 type() 其实并没有你想象的那么简单。
补充:isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
- isinstance()函数用法:
- type()函数用法:
13.Python3 可以给变量命名中文名,知道为什么吗?
答:Pyhton3 源码文件默认使用utf-8编码(支持中文),这就使得以下代码是合法的:
14.写一个程序,判断给定年份是否为闰年。
答:代码如下:
# 闰年:年份是400的倍数,或者年份是4的倍数但不是100的倍数
year = int(input("请输入年份:"))
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
print(year,"年是闰年!")
else:
print(year,"年不是闰年!")
15. Python 的 floor 除法使用 “//” 实现,那 3.0 // 2.0 会显示什么内容呢?
答:Python 会义无反顾地执行 floor 除法原则,答案是:1.0。有图有真相:
16.不使用 IDLE,你可以轻松说出 5 ** -2 的值吗?那3 ** 2 ** 3呢?
0.04,也就是 1/25。,幂运算操作符比其左侧的一元操作符优先级高,比其右侧的一元操作符优先级低。例如:-3 ** 2 结果为-9 ,而3 ** -2结果为1/9
所以,python中幂运算符**如果是多个的话,应该先算右边再算左边,也就是从右往左计算。
再所以,print(2 ** 2 ** 32),是先算后面的,最后算2的几十亿次幂,由于内存不够会导致溢出,程序崩溃;print((2 ** 2) ** 32),是计算4的32次幂,可以直接算出来。
最后3 ** 2 ** 3 结果为6561。
17.还记得我们上节课那个求闰年的作业吗?如果还没有学到“求余”操作,还记得用什么方法可以“委曲求全”代替“%”的功能呢?
答:用“if year/400 == int(year/400)”这样的方式来“委曲求全”。
18.请写一个程序打印出 0~100 所有的奇数。
'''while循环'''
number = 1
while number <= 100:
if(number % 2 != 0):
print(number)
number = number + 1
'''for循环'''
for i in range(1, 101):
if i % 2 != 0:
print(i)
19.爱因斯坦的难题。
爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。
题目:请编程求解该阶梯至少有多少阶?
count = 1
while 1:
if count % 2 == 1 and count % 3 == 2 and count % 5 == 4 and count % 6 == 5 and count % 7 == 0:
print("一共有台阶数:", count)
break
else:
count += 1
改进:
1)根据题意,count一定是7的倍数;
2)如果找不到,需要有相关提示呀,所以设置flag作为标志。
flag = 0
count = 7
while not flag:
# 因为保证了一定是7的倍数,所以不用加count % 7 == 0
if count % 2 == 1 and count % 3 == 2 and count % 5 == 4 and count % 6 == 5:
flag = 1
else:
count += 7 #直接+7
if flag == 1:
print("一共有台阶数:", count)
else:
print("无解!")
7.再次改进小游戏
要求:当用户输入错误类型的时候,及时提醒用户重新输入,防止程序崩溃。
...
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
# 这种想法是因为type(1)会返回<class 'int'>,如果type(temp)返回结果一致说明输入是整数。
while type(temp) != type(1):
print("抱歉,输入不合法,", end='')
temp = input("请输入一个整数:")
...
或者可能这样:
...
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
# not操作符的作用是将布尔类型的结果翻转:即取反的意思,not True == Flase
while not isinstance(temp, int):
print("抱歉,输入不合法,", end='')
temp = input("请输入一个整数:")
...
以上方法的思路是正确的,不过似乎忽略了一点儿:就是input()的返回值始终是字符串,所以type(temp)永远是<class ‘str’>!
这时候,可以使用字符串内置的一个函数:
s为字符串,s.isdigit() 判断字符串包含的所有字符是否都是数字,为真返回 Ture,否则返回 False。
所以,可以改造如下:
...
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
while not temp.isdigit():
print("抱歉,输入不合法,", end='')
temp = input("请输入一个整数:")
...