文章目錄
分支結構2:
if - elif - else結構
部分內容轉自 https://www.yiibai.com/python/python_if_else.html
elif
語句允許檢查多個表達式是否爲True
,並在其中一個條件求值爲True
時立即執行對應代碼塊。
與else
語句類似,elif
語句是可選的。 但是,與else
語句不同的是,else
語句最多可以有一個語句,在if
之後可以有任意數量的elif
語句。
語法
if expression1:
statement(s)
elif expression2:
statement(s)
elif expression3:
statement(s)
else:
statement(s)
Python
Python不像其他編程語言那樣提供switch
或case
語句,但是可以使用if..elif...else
語句來模擬switch case
,如下所示:
示例
amount = int(input("Enter amount: "))
if amount<1000:
discount = amount*0.05
print ("Discount",discount)
elif amount<5000:
discount = amount*0.10
print ("Discount",discount)
else:
discount = amount*0.15
print ("Discount",discount)
print ("Net payable:",amount-discount)
Python
當執行上述代碼時,會產生以下結果 -
Enter amount: 600
Discount 30.0
Net payable: 570.0
Enter amount: 3000
Discount 300.0
Net payable: 2700.0
Enter amount: 6000
Discount 900.0
Net payable: 5100.0
Shell
循環結構:for循環和while循環
1. for循環
1)語法
for 變量 in 序列:
循環體
2)說明
項目 | 解釋 |
---|---|
for | 關鍵字,固定寫法 |
變量名 | 和聲名變量時的要求一樣 |
in | 關鍵字,固定寫法 |
序列 | 容器型數據;字符串、列表、字典、元組、集合、迭代器、生成器、range |
: | 固定寫法 |
循環體 | 和for保持一個縮進的一條或者多條語句;需要重複執行的語句 |
3)執行過程
讓變量依次在序列中取值,取完爲止;每取一個值,執行一次循環體
for x in 'abc123':
print('x=:', x)
print('+++++')
結果:
x=: a
+++++
x=: b
+++++
x=: c
+++++
x=: 1
+++++
x=: 2
+++++
x=: 3
+++++
2. range()
range(N) - 產生0 ~ N - 1的數字序列,遞進1
range(M, N) - 產生M ~ N - 1的數字序列,遞進1
range(M, N, step) - 產生M ~ N - 1的數字序列,遞進step
for x in range(4):
print(x)
print('=======分割線========')
for x in range(6, 10):
print(x)
print('=======分割線========')
for x in range(0, 6, 2):
print(x)
結果:
0
1
2
3
=======分割線========
6
7
8
9
=======分割線========
0
2
4
當用range控制循環次數時,如果循環變量沒用,只是爲了控制循環次數,推薦直接用下劃線命名,能直接了當的告訴閱讀代碼的人
for _ in range(100):
print(1)
課堂練習1:
打印0~100中所有能被3整除的數
兩種方法:
for i in range(101):
if i % 3 == 0:
print(i)
for i in range(0, 101, 3):
print(i)
課堂練習2:
統計1~100中,能被4整除並且個位數是2的數字的個數
j = 0
for i in range(0, 101, 4):
if i % 10 == 2:
j += 1
print(j)
課堂練習3:
計算1+2+3+4+…+100
sum1 = 0
for i in range(1, 101):
sum1 += i
print(sum1)
3. while循環
1)語法
while 條件語句:
循環體
2)說明
代碼 | 說明 |
---|---|
while | 關鍵字,固定寫法 |
條件語句 | 任何有結果的表達式 |
: | 固定寫法 |
循環體 | 和while保持一個縮進的一條或者多條語句;需要重複執行的語句 |
3)執行過程
先判斷條件語句是否爲True,若是,執行循環體,執行完後繼續此過程,直到條件語句爲False爲止
num = 0
while num < 5:
print('...')
num += 1
結果:
...
...
...
...
...
4. for循環和while循環的選擇
1)什麼時候用for循環
循環次數確定的時候
遍歷序列
2)什麼時候用while循環
死循環(無限循環)
循環次數不確定
例子:
value = 1
while value != '0':
value = input('輸入數字')
5. 循環關鍵字
1)continue
continue是循環體中的關鍵字
如果執行到continue,當次循環結束,進入下一個循環
for x in range(4):
print('===')
if x & 1 == 0:
continue
print('+++')
結果:
===
===
+++
===
===
+++
2)break
break是循環體中的關鍵字
循環中執行到break時,結束整個循環,即跳出循環
for x in range(4):
print('===')
if x & 1 == 0:
break
print('+++')
結果:
===
課堂練習4:
遊戲開始的時候隨機產生一個數字,不斷輸入數字,直到輸入的數字和產生的數字一致,遊戲結束。在沒有猜對的時候,給出“大了”“小了”的提示。
from random import randint
target = randint(0, 100) # 產生0到100的隨機數
while True:
num = int(input('猜:'))
if num < target:
print('小了')
elif num > target:
print('大了')
else:
print('你猜對了')
break
3)else
循環自然死亡時,else的代碼段會執行
循環強制死亡時,則不會
自然死亡:for循環把值取完;while條件爲False
強制死亡:break
完整的for循環
for 變量 in 序列:
循環體
else:
代碼段
完整的while循環
while 條件語句:
循環體
else:
代碼段
自然死亡例子:
for x in range(4):
print(x)
else:
print('else')
結果:
0
1
2
3
else
強制死亡例子:
for x in range(4):
print(x)
break
else:
print('else')
結果:
0
else存在的意義:
可以通過看else裏的代碼有沒有執行,來判斷循環是否遇到了break
隨堂練習5:
計算1!+2!+3!…+10!
方法1:
sum1 = 0
for i in range(1, 11):
num = 1
for j in range(1, i):
num *= j
sum1 += num
print(sum1)
方法2:
sum1 = 0
sum2 = 1
for i in range(1, 11):
sum2 *= i
sum1 += sum2
print(sum1)
作業
作業內容是自己做的,可能不對,若存在問題,感謝指出
後面會更新老師的答案
"""
1. 求斐波那契數列列中第n個數的值:
1, 1, 2, 3, 5, 8, 13, 21, 34....
"""
def fibonacci(n):
num_1 = 1
num_2 = 1
for i in range(0, n - 2):
temp = num_1 + num_2
num_1 = num_2
num_2 = temp
print(num_2)
while True:
n = input('請輸入斐波那契數列的位數(輸入q退出): ')
if n == 'q':
break
else:
try: # 判斷輸入的數據是否可以轉爲整型,若不是,打印警告
n = int(n)
if n <= 2:
raise ValueError
except ValueError:
print('\n鐵憨憨,讓你輸斐波那契數列的位數,你非要皮一下,重來!\n')
else:
fibonacci(n)
"""
2. 判斷101-200之間有多少個素數,並輸出所有素數。
判斷素數的方法:一個數分別除2到sqrt(這個數),
如果能被整除,則表明此數不不是素數,反之是素數(prime number)
"""
def check_prime_num(n):
"""檢查數n是否素數"""
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
break
else:
continue
else:
return True
prime_num_num = 0
for j in range(101, 201):
if check_prime_num(j):
print(j)
prime_num_num += 1
print(prime_num_num)
"""
3. 打印出所有的⽔水仙花數,所謂⽔水仙花數是指⼀一個三位數,其各位數字⽴立⽅方和等於該數本身。例例如: 153是
⼀一個⽔水仙花數,因爲153 = 1^3 + 5^3 + 3^3
"""
import math as ma
for num in range(100, 1000):
a = num // 100
c = num % 10
b = ma.floor((num - 100 * a) / 10)
if a ** 3 + b ** 3 + c ** 3 == num:
print(num)
"""
4. 有⼀一分數序列: 2/1,3/2,5/3,8/5,13/8,21/13...
求出這個數列的第20個分數
分子:上一個分數的分子加分母
分母: 上⼀一個分數的分子 fz = 2 fm = 1 fz+fm / fz
"""
def get_target_num(n):
top = 2
low = 1
for i in range(2, n + 1):
temp = top + low
low = top
top = temp
print(r'%d/%d' % (top, low))
get_target_num(20)
"""
5. 給一個正整數,要求:
1. 求它是幾位數
2. 逆序打印出各位數字
"""
def solution1(n):
"""方法1"""
num_str = str(n) # 核心思想:轉化爲字符串
num_list = []
# 將每一位數字按序存儲在列表中
for i in range(0, len(num_str)):
num_list.append(num_str[i])
# 打印數字位數
print(len(num_list))
# 反轉列表,並打印
num_list.reverse()
for j in num_list:
print(j, end='')
def solution2(n):
"""方法2"""
num_str = str(n)
print(len(num_str))
for i in range(len(num_str) - 1, -1, -1):
print(num_str[i], end='')
while True:
n = input('\n請輸入一個正整數(輸入q退出): ')
if n == 'q':
break
else:
try: # 判斷輸入的數據是否是正整數,若不是,打印警告
n = int(n)
if n <= 0:
raise ValueError
except ValueError:
print('\n鐵憨憨,讓你正整數,你非要皮一下,重來!')
else:
solution2(n)
"""
6. 小明單位發了100元的購物卡,小明到超市買三類洗化用品,
洗髮水(15元),香皂(2元),牙刷(5元)。
要把100元整好花掉,可如有哪些購買結合?
"""
money = 100
a_price = 15
b_price = 5
c_price = 2
# 遍歷商品a的個數
for a_num in range(1, int(money / a_price) + 1):
left_money1 = money
left_money1 -= a_num * a_price
# 遍歷商品b的個數
for b_num in range(1, int(left_money1 / b_price) + 1):
left_money2 = left_money1
left_money2 -= b_num * b_price
# 遍歷商品c的個數
for c_num in range(1, int(left_money2 / c_price) + 1):
left_money3 = left_money2
left_money3 -= c_num * c_price
if left_money3 == 0:
print(a_num, b_num, c_num)
"""
7.我國古代數學家張邱建在《算經》中出了一道“百錢買百雞”
的問題,題意是這樣的:
5文錢可以買一隻公雞,3文錢可以買一隻母雞,1文錢可以買3只雛雞。
現在用100文錢買100只雞,那麼各有公雞、母雞、雛雞多少隻?
請編寫程序實現。
"""
# 這道題由於可以直接利用上一題的大部分代碼,我就懶得重新優化算法了
money = 100
all_num = 100
a_price = 5
b_price = 3
c_price = 1
# 遍歷商品a的個數
for a_num in range(1, int(money / a_price) + 1):
left_money1 = money
left_money1 -= a_num * a_price
# 遍歷商品b的個數
for b_num in range(1, int(left_money1 / b_price) + 1):
left_money2 = left_money1
left_money2 -= b_num * b_price
# 遍歷商品c的個數
for c_num in range(1, int(left_money2 / c_price) + 1):
left_money3 = left_money2
left_money3 -= c_num * c_price
if left_money3 == 0 and a_num + b_num + c_num * 3 == all_num:
print(a_num, b_num, c_num)
"""
8. 這是經典的"百馬百擔"問題:
有一百匹馬,馱一百擔貨,大馬馱3擔,中馬馱2擔,兩隻小馬馱1擔,
問有大,中,小馬各幾匹?
"""
# 算法和7一模一樣,把擔轉化爲錢就可以了,略了
"""
9. 控制檯輸出三角形
a.根據n的值的不同,輸出相應的形狀
n = 5時 n = 4
***** ****
**** ***
*** **
** *
*
b.根據n的值的不同,輸出相應的形狀(n爲奇數)
n = 5 n = 7
* *
*** ***
***** *****
*******
"""
def reverse_triangle(n):
"""倒三角輸出"""
while n > 0:
for i in range(0, n):
print('*', end='')
n -= 1
print('')
def triangle(n):
"""居中正三角輸出"""
num_n = n
while n > 0:
space_num = int((n - 1) / 2)
space_str = ' ' * space_num
print(space_str, end='')
star_num = num_n - space_num * 2
star_str = '*' * star_num
print(star_str, end='')
print(space_str, end='')
n -= 2
print('')
def play_reverse_triangle():
while True:
n = input('請輸入正整數(輸入q退出): ')
if n == 'q':
break
else:
try: # 判斷輸入的數據是否是正整數,若不是,打印警告
n = int(n)
if n <= 0:
raise ValueError
except ValueError:
print('\n鐵憨憨,讓你輸正整數,你非要皮一下,重來!')
else:
reverse_triangle(n)
def play_triangle():
while True:
n = input('請輸入正奇數(輸入q退出): ')
if n == 'q':
break
else:
try: # 判斷輸入的數據是否是正奇數,若不是,打印警告
n = int(n)
if n <= 0 or n & 1 == 0:
raise ValueError
except ValueError:
print('\n鐵憨憨,讓你輸正奇數,你非要皮一下,重來!')
else:
triangle(n)
作業解答from老師
基礎題
# 1.讀程序
# 1)
numbers = 1
for i in range(0, 20):
numbers *= 2
print(numbers)
"""
numbers = 1
i = 0 ~ 19, 循環20次
i = 0: numbers *= 2 -> numbers = numbers * 2 = 1 * 2 = 2 = 2^1
i = 1: numbers *= 2 -> numbers = numbers * 2 = 2 * 2 = 4 = 2^2
i = 2: numbers *= 2 -> numbers = numbers * 2 = 4 * 2 = 8 = 2^3
...
i = 19: numbers *= 2 -> numbers = numbers * 2 = 2^20
結論: 計算2的20次方
"""
# 2)
summation = 0
num = 1
while num <= 100:
if (num % 3 == 0 or num % 7 == 0) and num % 21 != 0:
summation += 1
num += 1
print(summation)
# print(num)
"""
num = (1, 2, 3, 4, ..., 99, 100), 101
總結: 統計1~100中能被3或者7整除但是不能同時被3和7整除的數的個數
"""
# 1.求1到100之間所有數的和、平均值
# 方法一:
sum1 = 0
count = 0
for num in range(1, 101):
sum1 += num
count += 1
print('和:', sum1, '平均值:', sum1 / count)
# 方法二:
num = 1 # 計算數字
sum1 = 0 # 和
count = 0 # 個數
while num <= 100:
sum1 += num # 求和
count += 1 # 統計個數
num += 1 # 控制num取一下數字
print('和:', sum1, '平均值:', sum1 / count)
# 2.計算1-100之間能3整除的數的和
# 方法1:
sum1 = 0
for num in range(3, 101, 3):
sum1 += num
print('第2題和:', sum1)
# 方法:
num = 0
sum1 = 0
while num <= 100:
sum1 += num
num += 3
print('第2題和:', sum1)
# 3. 計算1-100之間不能被7整除的數的和
# 方法一:
sum1 = 0
for num in range(100, 0, -1):
if num % 7 != 0:
sum1 += num
print('第3題和:', sum1)
# 方法二:
num = 100
sum1 = 0
while num >= 1:
if num % 7 != 0:
sum1 += num
num -= 1
print('第3題和:', sum1)
# 控制while循環產生數字序列
"""
產生的數字範圍是M ~ N (M < N), step是步長(正)
# 方法一: 升序
num = M
while num <= N:
每次循環要做的事情
num += step
# 方法二: 降序
num = N
while N >= M:
每次循環要做的事情
num -= step
"""
# 1. 求斐波那契數列中第n個數的值:1,1,2,3,5,8,13,21,34....
# 規律: 前兩個數是1,從第三個數開始,每個是它前兩個數的和
n = 3
pre_1 = 1
pre_2 = 1
if n == 1 or n == 2:
print('當前數是: 1')
else:
for _ in range(n - 3):
# python寫法:
pre_1, pre_2 = pre_2, pre_1 + pre_2
# java/c的寫法
# t = pre_1
# pre_1 = pre_2
# pre_2 = t + pre_2
print('當前數是:', pre_1 + pre_2)
# 補充: 交換兩個變量的值
# python寫法:
a = 10
b = 20
a, b = b, a # a, b = 20, 10
print(a, b)
# java/c寫法
a = 10
b = 20
t = a
a = b
b = t
print(a, b)
# 2. 判斷101-200之間有多少個素數,並輸出所有素數
# 素數就是質數: 除了1和這個數本身,不能再被其他數整除。這樣數就是質數
# 方法一:
count = 0
# 取出101~200之間的所有的數
for num in range(101, 200, 2):
# 判斷num取出來的這個數是不是素數: 判斷2~num-1之間有沒有數能去整除的
for x in range(2, int(num**0.5+1)):
if num % x == 0:
# print(num, '不是素數')
break
else:
# print(num, '是素數')
count += 1
print('101-200之間素數的個數:', count)
# 方法二:
for num in range(101, 200, 2):
flag = True # 假設當前取出來的這個數是素數
for x in range(2, int(num**0.5+1)):
if num % x == 0:
flag = False
break
if flag == True:
print(num, '是素數!')
# 3.打印出所有的⽔仙花數,所謂⽔仙花數是指⼀個三位數,其各位數字⽴⽅和等於該數本身。例如:153是
# ⼀個⽔仙花數,因爲153 = 1^3 + 5^3 + 3^3
for num in range(100, 1000):
ge = num % 10
shi = num // 10 % 10 # shi = num % 100 // 10
bai = num // 100
if ge ** 3 + shi ** 3 + bai ** 3 == num:
print(num, '是水仙花數')
# 4.有⼀分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的第20個分數
# 分子: 前一個分數的分子+前一個分數的分母
# 分母: 前一個分數的分子
n = 4
fen_zi = 2
fen_mu = 1
for _ in range(n-1):
fen_zi, fen_mu = fen_zi + fen_mu, fen_zi
print('當前分數:', fen_zi, '/', fen_mu)
# 5.給⼀一個正整數,要求:1、求它是幾位數 2.逆序打印出各位數字
# 123 -> 123 // 10 -> 12 // 10 -> 1 // 10 -> 0
# 7236 -> 7236 // 10 -> 723 // 10 -> 72 // 10 -> 7 // 10 -> 0
num = 345
count = 0
while True:
# 倒序取出每一位
print(num % 10, end='')
num //= 10
# 統計位數
count += 1
if num == 0:
break
print()
print(count, '位數')
提高
print('==================第1題=================')
# 1.控制檯輸入年齡,根據年齡輸出不同的提示(例如:老年人,青壯年,成年人,未成年,兒童)
age = int(input('請輸入年齡:')) # input輸入的數據是字符串,需要先轉換成int類型
# 後面的條件都是在前面的條件不成立的時候進行判斷的
if age <= 12:
print('兒童')
elif age < 18:
print('未成年')
elif age <= 28:
print('成年人')
elif age <= 50:
print('壯年')
else:
print('老年人')
print('==================第2題=================')
# 2.計算5的階乘 5!的結果是
# 解題思路: 5! = 5*4*3*2*1, 先將1,2,3,4,5依次取出,再累計求乘積
sum1 = 1 # 保存最後的乘積,默認值爲1
for num in range(1, 6):
sum1 *= num
print('5!爲:', sum1)
print('==================第3題=================')
# 3.求1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加變成了累乘。
sum1 = 0 # 保存最後的和
sum2 = 1 # 保存1~20中,每個數的階乘
# 依次取出1~20
for num in range(1, 21):
sum2 *= num
sum1 += sum2
print('1+2!+3!+...+20!爲:', sum1)
print('==================第4題=================')
# 4.計算 1+1/2!+1/3!+1/4!+...1/20!=?
sum1 = 0 # 保存最後的和
sum2 = 1 # 保存1~20中,每個數的階乘
# 依次取出1~20
for num in range(1, 21):
sum2 *= num
sum1 += 1/sum2
print('1+2!+3!+...+20!爲:', sum1)
print('==================第5題=================')
# 5.循環輸入大於0的數字進行累加,直到輸入的數字爲0,就結束循環,並最後輸出累加的結果。
sum1 = 0
while True:
num = int(input('請輸入數字:'))
sum1 += num
# 如果輸入爲0,退出循環
if num == 0:
break
print('輸入的數字的和:', sum1)
print('==================第6題=================')
# 6.求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。
# 例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。
sum1 = 0 # 保存最後的和
a = 2
num = a # 保存求和的每一項
n = 5 # 保存求和的項數
for _ in range(n):
sum1 += num
num = num * 10 + a # 22 = 2*10+2; 222 = 22*10+2; 2222 = 222*10+2;...
print('最終的和位:', sum1)
print('==================第7題=================')
# 7.輸入三個整數x,y,z,請把這三個數由小到大輸出
x = int(input('請輸入x:'))
y = int(input('請輸入y:'))
z = int(input('請輸入z:'))
# 先找到最小的一個數,存在x中
if x > y:
x, y = y, x
if x > z:
x, z = z, x
# 再找出y和z中較小的存在y中,最大的存在z中
if y > z:
y, z = z, y
# 最後輸出x,y,z的值即可
print(x, y, z)
print('==================第8題=================')
# 8.控制檯輸出三角形
print('========a========')
# a.根據n的值的不同,輸出相應的形狀
# 規律:從上往下每一行*的個數分別是5,4,3,2,1; 所以先將每一行的*的個數取到
n = 5
# num的取值分別是5,4,3,2,1
for num in range(n, 0, -1):
# 打印每一行*
for _ in range(num):
print('*', end='')
# 一行打印結束後需要打印換行
print()
print('========b========')
# b.根據n的值的不同,輸出相應的形狀(n爲奇數)
# 規律:每一行*的個數分別是1,3,5;*前的空格數分別是2,1,0; *的個數 + 空格數的2倍 == n
n = 5
# num的值分別是1, 3, 5
for num in range(1, n+1, 2):
# 先輸出空格
space_count = int((n - num) / 2)
for _ in range(space_count):
print(' ', end='')
# 再輸出*
for _ in range(num):
print('*', end='')
# 一行內容輸出完成後換行
print()
print('==================第9題=================')
# 9.輸出9*9口訣。 程序分析:分行與列考慮,共9行9列,i控制行,j控制列。
# 第二個乘數行:每個表達式的第二個乘數是這個表達式所在的行數,第一行第二個乘數爲1, 第2行第二個乘數都爲2
# 第3行第二個乘數爲3,....
# 第一個乘數:第一行是1; 第2行是:1,2;第3行是:1,2,3; ...
# i取出所有的行,也就是每一行的第二個乘數
for i in range(1, 10):
# j控制每一行第一個乘數
for j in range(1, i+1):
# 按照a×b=c的格式輸出每一個表達式
# print(j, '×', i, '=', i*j, sep='', end=' ')
print('%d×%d=%-2d' % (j, i, i*j), end=' ') # 這個是格式字符串,後面會講,不會可以先用上面那個方法
# 一行結束後換行
print()
print('==================第10題=================')
# 10.這是經典的"百馬百擔"問題,有一百匹馬,馱一百擔貨,大馬馱3擔,中馬馱2擔,兩隻小馬馱1擔,問有大,中,小馬各幾匹?
# 注意: 目前可以使用窮舉法
# 大馬最多:100 // 3 == 33 -> x
# 中馬最多: 100 // 2 == 50 -> y
# 小馬最多: 100 * 2 == 200 -> z
for x in range(1, 34):
for y in range(1, 51):
for z in range(2, 101, 2):
if x*3 + y*2 + z/2 == 100 and x + y + z == 100:
print('大馬:%d, 中馬:%d, 小馬:%d' % (x, y, z))
break