我的Python學習筆記_Day3 分支與循環

分支結構2:

if - elif - else結構

部分內容轉自 https://www.yiibai.com/python/python_if_else.html
老師筆記截圖1
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不像其他編程語言那樣提供switchcase語句,但是可以使用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

老師筆記截圖2

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

發佈了23 篇原創文章 · 獲贊 23 · 訪問量 1648
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章