【Python】小甲鱼2022最新版课程p6-p12——数字类型及其运算&布尔类型&运算符及其优先级笔记

文章目录

0.改进小游戏

第一个小游戏初始代码:

"""第一个小游戏:猜数字"""
temp = input("不妨猜一下小甲鱼现在心里想的是哪一个数字:")
guess = int(temp)
if guess == 8 :
	print("你是小甲鱼心里的蛔虫!")
   	print("哼,猜中了也没有奖励")
else:
   print("对不起,猜错啦,小甲鱼现在心里想的是8")
print("不玩啦,游戏结束")

改进游戏:

要求:

  1. 当用户猜错时,应该给出相应提示大了或者小了
  2. 应该提供多次机会给用户
  3. 每次运行程序,答案应该是随机的

改进后的小游戏代码:

'''改进第一个游戏'''
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("请输入一个整数:")
...

猜你喜欢

转载自blog.csdn.net/weixin_45041745/article/details/125867510