注:参考骆昊的Python - 100天从新手到大师项目笔记
目录
1. 分支结构
关键字
- if
- elif
- else
每个关键字后面记得加上冒号:
缩进
-
连续的代码如果保持相同的缩进,则属于同一个代码块。
-
缩进可以使用任意数量的空格,但通常使用4个空格,强烈建议不要使用制表键来缩进代码
-
或者可以设置代码编辑工具将一个制表键自动变成4个空格
Notes
强烈建议写代码的时候打开英文输入法,而中文输入法的英文输入模式
代码扁平化:能用扁平化代码表示的就不要使用嵌套结构,嵌套层次过多会影响代码的可读性。
2. 循环结构
两种循环结构
- for-in循环 (明确知道循环的次数)
- while循环(不明确具体的循环次数)
for-in循环
-
实现1-100的求和
-
total = 0 for x in range(1, 101): total += x print(total)
-
range的用法
- range(101):可以用来产生0到100范围的整数,取不到101。
- range(1, 101):可以用来产生1到100范围的整数,前面是闭区间后面是开区间。
- range(1, 101, 2):可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。
- range(100, 0, -2):可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。
while循环
-
通过布尔值控制循环
-
while True的用法
-
break和continue的使用
-
猜数字游戏
import random # 产生一个1-100范围的随机数 answer = random.randint(1, 100) counter = 0 while True: counter += 1 number = int(input('请输入: ')) if number < answer: print('大一点') elif number > answer: print('小一点') else: print('恭喜你猜对了!') break # 当退出while循环的时候显示用户一共猜了多少次 print(f'你总共猜了{counter}次')
-
99乘法表
for i in range(1, 10): for j in range(1, i + 1): print(f'{i}*{j}={i * j}', end='\t') print()
-
Notes
- end=’\t’ 是为空格
- print() 是为换行输出的效果
- answer = random.randint(1, 100) # random随机数的用法
- x、y值的互换
if x > y: x, y = y, x # Python中可以用这样的方式来交换两个变量的值,确定较大的一个值
3. 分支和循环结构的运用
3.1 对于数字的拆分
- 利用//和%把一个数字的十百千等位数拆分开来
- 或利用这两个符号将正整数反转
-
寻找水仙花数
""" 找出所有水仙花数 水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数, 它是一个3位数,该数字每个位上数字的立方之和正好等于它本身, 例如:13 + 53 + 33 = 153。 Version: 0.1 Author: 骆昊 """ for num in range(100, 1000): low = num % 10 mid = num // 10 % 10 high = num // 100 if num == low ** 3 + mid ** 3 + high ** 3: print(num)
-
正整数的反转
""" 正整数的反转 Version: 0.1 Author: 骆昊 """ num = int(input('num = ')) reversed_num = 0 while num > 0: reversed_num = reversed_num * 10 + num % 10 num //= 10 print(reversed_num)
3.2 暴力求解法(穷尽法)
- 对于一些求解的方式,可以根据取值范围采取穷举,有n个变量,就可进行n-1次for循环
- 整除的表达:a%3==0
-
百钱百鸡
""" 《百钱百鸡》问题 公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只? Version: 0.1 Author: 骆昊 """ # 假设公鸡的数量为x,x的取值范围是0到20 for x in range(0, 21): # 假设母鸡的数量为y,y的取值范围是0到33 for y in range(0, 34): z = 100 - x - y if 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0: print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')
3.3 善于使用 Ture or Flase
- 就是先假设!
- 如要输出多种情况,先假定不成立或成立,经过验证之后正确则输出这个结果,最后把Ture or Flase更正过来
-
打印素数
# 寻找100以内的素数(素数指的是只能被1和自身整除的正整数(不包括1)) for num in range(2, 100): # 假设num是素数 is_prime = True # 在2到num-1之间找num的因子 for factor in range(2, num): # 如果找到了num的因子,num就不是素数 if num % factor == 0: is_prime = False break # 如果布尔值为True在num是素数 if is_prime:
-
CRAPS赌博游戏
""" Craps赌博游戏 玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜; 玩家如果摇出其他点数则玩家继续摇骰子,如果玩家摇出了7点,庄家胜; 如果玩家摇出了第一次摇的点数,玩家胜;其他点数玩家继续摇骰子,直到分出胜负。 我们设定游戏开始时玩家有1000元的赌注 游戏结束的条件是玩家破产(输光所有的赌注) Version: 0.1 Author: 骆昊 """ from random import randint money = 1000 while money > 0: print(f'你的总资产为: {money}元') go_on = False # 下注金额必须大于0小于等于玩家总资产 while True: debt = int(input('请下注: ')) if 0 < debt <= money: break # 第一次摇色子 # 用1到6均匀分布的随机数模拟摇色子得到的点数 first = randint(1, 6) + randint(1, 6) print(f'\n玩家摇出了{first}点') if first == 7 or first == 11: print('玩家胜!\n') money += debt elif first == 2 or first == 3 or first == 12: print('庄家胜!\n') money -= debt else: go_on = True # 第一次摇色子没有分出胜负游戏继续 while go_on: go_on = False current = randint(1, 6) + randint(1, 6) print(f'玩家摇出了{current}点') if current == 7: print('庄家胜!\n') money -= debt elif current == first: print('玩家胜!\n') money += debt else: go_on = True print('你破产了, 游戏结束!')
3.4 _的使用
-
斐波那契数列
""" 输出斐波那契数列前20个数 数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,按照这个规律, 斐波那契数列的前10个数是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55。 Version: 0.1 Author: 骆昊 """ # 前两个数都是1 a, b = 1, 1 print(a, b, end=' ') # 通过递推公式算出后面的18个数 for _ in range(18): a, b = b, a + b print(b, end=' ')