2019年6月28日 星期五

Python 練習-02

一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
這題一開始繞不出來,以為只有一個解,運算式如下

Y^2=X+100
Z^2=X+100+168.......由於X+100=Y^2 ...所以可以寫成

Z^2=Y^2+168,所以當等式相等時就可以算出X


for y in range(1,50):
    for z in range(1,50):
        if (y**2+168==z**2):
            x=y**2-100
            print (f'X= {x} ,Y= {y} , Z= {z}')

#***************執行結果**********************

X= -99 ,Y= 1 , Z= 13
X= 21 ,Y= 11 , Z= 17
X= 261 ,Y= 19 , Z= 23
X= 1581 ,Y= 41 , Z= 43


質因數分解,是將一個正整數寫成幾個因數的乘積。
例如: 45 = 3,3,5

比較單純的想法是
1. 找出能把 X 整除的數
2. 把整除後的商,當作下一個被除數,重複第一個步驟,直到被除數等於1 為止


temp=[]
temp2=int(input('請輸入一個正整數 : '))
x=temp2
while True:
    if (x==1) :
        break
    for i in range(2,x+1,1):
        if (x%i==0):
            x=int(x/i)
            temp.append(i)
            break

print(f'{temp2} 質因數分解 = {temp}')

#***************執行結果**********************

請輸入一個正整數 : 90
90 質因數分解 = [2, 3, 3, 5]


求質數,質數就是除了1和該數自身外,無法被其他自然數整除的數
所以只要統計被整除的次數,就可以判斷是否為質數(不包含1,只能被整除1次的數)


for index in range(2,10,1):
temp=0
for x in range(2,index+1,1):
if(index%x==0):
temp=temp+1
if (temp<2 font="">
print(index)

#***************執行結果**********************

2
3
5
7



2019年6月25日 星期二

Python 練習-01


# e (數學常數) 歐拉數

歐拉數  e=1+1/1! + 1/2! +......+1/n!
首先要把 n! 先解決

n!= 1x2x3x......xn

先來驗證5!
5!=1x2x3x4x5 = 120


n = 1
for y in range(1,6,1):
    for i in range(1, y + 1):
        n = n * i
    print(f'{i}! = {n}')
    n = 1

#***************執行結果**********************

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120


再來就是將每個階層倒數相加就可以了


n1 = 0
n = 1
for y in range(10, 101, 10):
    for i in range(1, y + 1):
        n = n * i
        n1 = n1 + (1 / n)
    print(f'{i} = {n1 + 1}')
    n1 = 0
    n = 1

#***************執行結果**********************

10 = 2.718281801146385
20 = 2.7182818284590455
30 = 2.7182818284590455
40 = 2.7182818284590455
50 = 2.7182818284590455
60 = 2.7182818284590455
70 = 2.7182818284590455
80 = 2.7182818284590455
90 = 2.7182818284590455
100 = 2.7182818284590455


#求最大公約數
可以使用 輾轉相除法

輾轉相除法就是要尋找最大公約數的兩個數字進行重複除法,直到最後得到餘數為0
下面例子:試找出40和64的最大公約數

64 ÷ 40 = 1 .. 24
40 ÷ 24 = 1 .. 16
24 ÷ 16 = 1 .. 8
16 ÷ 8 = 2 .. 0
得到餘數為0就可以了。最後一個餘數是8,因此40和64的最大公約數就是8。

這時就要用到無窮迴圈,注意break使用時機,避免無法跳出迴圈

m=int(input('請輸入第一個數字: '))
n=int(input('請輸入第二個數字: '))

while True:
    if(m>n):
        if (n==0):
            print(f'最大公約數是 {m}')
            break
        else:
            x=m%n
            m=n
            n=x
    else:
        if(m==0):
            print(f'最大公約數是 {n}')
            break
        else:
             temp=m
             m=n
             n=temp

#***************執行結果**********************

請輸入第一個數字: 16
請輸入第二個數字: 40
最大公約數是 8


求解一元二次方程式



import math

X1=0
X2=0

A=int(input('請輸入 X^2 :'))
B=int(input('請輸入X :'))
C=int(input('請輸入整數 :'))

if(A==0):
    X1=0
    X2=(-1*C)/B
    print(f'X={X2}')
else:
    b=-1*B
    X1=(b+math.sqrt(B*B-(4*A*C)))/(2*A)
    X2=(b-math.sqrt(B*B-(4*A*C)))/(2*A)
    print(f'X={X1} 或是 {X2}')

#***************執行結果**********************

請輸入 X^2 :1
請輸入X :7
請輸入整數 :12
X=-3.0 或是 -4.0


當 b^2-4ac 等於負值時程式會發生錯誤,因為負值無法開根號
避免錯誤可以用下列方式

1. 錯誤訊息處理

當 b^2-4ac 等於負值時程式會發出ValueError錯誤訊息,所以可以用 try 來攔截


    try:
        X1=(b+math.sqrt(B*B-(4*A*C)))/(2*A)
        X2=(b-math.sqrt(B*B-(4*A*C)))/(2*A)
    except ValueError:
        print ('輸入的數值有誤,無法計算,請重新輸入')
    else:
        print(f'X={X1} 或是 {X2}')


2. 邏輯判斷,當 b^2-4ac 等於負值時,就顯示訊息,並重新輸入


while True:
    A=int(input('請輸入 X^2 :'))
    B=int(input('請輸入X :'))
    C=int(input('請輸入整數 :'))
    if ((B*B-(4*A*C))>1):
        break
    else:
        print('輸入的數值有誤,無法計算,請重新輸入')


修改後的完整程式:

import math

X1=0
X2=0
while True:
    A=int(input('請輸入 X^2 :'))
    B=int(input('請輸入X :'))
    C=int(input('請輸入整數 :'))
    if ((B*B-(4*A*C))>1):
        break
    else:
        print('輸入的數值有誤,無法計算,請重新輸入')

if(A==0):
    X1=0
    X2=(-1*C)/B
    print(f'X={X2}')
else:
    b=-1*B
    try:
        X1=(b+math.sqrt(B*B-(4*A*C)))/(2*A)
        X2=(b-math.sqrt(B*B-(4*A*C)))/(2*A)
    except ValueError:
        print ('輸入的數值有誤,無法計算,請重新輸入')
    else:
        print(f'X={X1} 或是 {X2}')


2019年6月24日 星期一

Python 自學方案- Step(七)

List 列表,也可以說是陣列 Array,它的索引值0開始,List的語法如下

list1=[A,B,C,D,E,F,G] ,list1是串列變數名稱,串列的值放在 [  ] 中,以 , 分隔
第0位置為"A" ,第1位置為"B" 依此類推

1. 輸出list1 所有的值
2. 輸出list1 索引值 0~4 的值
3. 輸出list1 索引值5之後的值 (包含索引5)

list1=[1,2,3,4,5,6,7,8]
print(list1)
print(list1[0:4])
print(list1[5:])

#***************執行結果**********************

[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4]
[6, 7, 8]


串列的統計資料,最大值,最小值,總和,統計串列個數及修改串列
可以指定某個索引值將內容修改

list1=[10,12,14,11,9,16,15]
print(f'最大數= {max(list1)}')
print(f'最小數= {min(list1)}')
print(f'總  和= {sum(list1)}')
print(f'串列數= {len(list1)}')
print(f'修改前的串列= {list1}')
list1[4]=35
print(f'修改後的串列= {list1}')

#***************執行結果**********************

最大數= 16
最小數= 9
總  和= 87
串列數= 7
修改前的串列= [10, 12, 14, 11, 9, 16, 15]
修改後的串列= [10, 12, 14, 11, 35, 16, 15]


串列合併 ,將兩個或以上多個串列合併成一個串列
del 刪除,將串列中的值刪除或是整個串列刪除
List.append ,在串列的尾端增加值
insert,指定位置插入值
sort 排序方式會永久改變串列內容,由小到大排,reverse=True則是由大排到小


array1=[1,3,5]
array2=[2,4,6]
array3=array1+array2
print(array3)
del array3[3] #將索引3的值刪除
print(array3)
array3.append(10) #在串列的尾端增加10
print(array3)
array3.insert(3,99) #在串列位置3 插入99

print(array3)
array3.sort()
print(array3)
array3.sort(reverse=True)

print(array3)

#***************執行結果**********************

[1, 3, 5, 2, 4, 6]
[1, 3, 5, 4, 6]
[1, 3, 5, 4, 6, 10]
[1, 3, 5, 99, 4, 6, 10]
[1, 3, 4, 5, 6, 10, 99]

[99, 10, 6, 5, 4, 3, 1]


二維列表(二維陣列)
例如下列例子(0,0) 就是 "小明" ,(1,0) 就是 "小華"
 (0,2) 就是 86 ,依此類推
這樣就可以做成績的計算

array01=[['小明',90,86,77,89,0],
         ['小華',92,80,88,79,0],
         ['小王',88,60,79,90,0],
         ['小李',70,65,58,70,0],
         ]

array01[0][5]=sum(array01[0][1:5])
array01[1][5]=sum(array01[1][1:5])
print(array01[0])
print(array01[1])
print(f'{array01[0][0]}平均值: {array01[0][5]/4}')

#***************執行結果**********************

['小明', 90, 86, 77, 89, 342]
['小華', 92, 80, 88, 79, 339]
小明平均值: 85.5


2019年6月3日 星期一

Python 自學方案- Step(六)

if判斷式,可以依據程式不同條件的需求,來執行不同的程式碼,其語句如下:

if 判斷式:
    # 如果判斷式成立,就會執行這段程式碼,但記得縮排,否則將出現錯誤。

如下: 由於 Print("A>5")沒有縮排,執行後就會出現錯誤訊息

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a=10
>>> if a>15:
... print ("A>15")
  File "", line 2
    print ("A>15")
        ^
IndentationError: expected an indented block
>>>

判斷式符合,且 Print("A>5")有正確縮排,就會正常執行

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a=20
>>> if a>15:
...     print("A>15")
...
A>15

可以讓程式更完整,增加 else : ,如下:

Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a=10
>>> if a>15:
...     print("A>15")
... else:
...     print("A<15 font="">
...
A<15 font="">
>>>

如果有多個判斷式,可以增加 elif: 如下

if 判斷式1:
    # 如果判斷式1成立,就會執行這段程式

elif 判斷式2:
    # 如果判斷式2成立,就會執行這段程式碼,依據需要可以有多個elif

else: 
    # 如果前面的判斷式都不成立,就會執行這段程式碼

我們可以寫一個計算折扣的程式
price=600
discount=0
if price>1000 :
    discount=0.9
elif price<=1000 and price>500:
    discount=0.95
else:
    discount=1

print(f'折扣後價錢= {price*discount}')

#***************執行結果**********************

折扣後價錢= 570.0


由於price=600,是固定的,要計算還要改程式,有點麻煩,可以把它修改成讓使用者自行輸入價錢後自動計算,如下
input 函式是讓使用者可以輸入,透過input輸入都會變成文字型態,所以要在之前增加 int(),轉成數字才能運算。

price=int(input('請輸入購買價格= '))

discount=0
if price>1000 :
    discount=0.9
elif price<=1000 and price>500:
    discount=0.95
else:
    discount=1

print(f'折扣後價錢= ${price*discount}')

#***************執行結果**********************

請輸入購買價格= 2000
折扣後價錢= $1800.0


我們可以寫一個稍微複雜的程式 ;計算BMI
利用 記事本 或是 Notepad++ 還是其他IDE軟體撰寫,存成BMI.py
在命令提示字元內執行 python BMI.py即可執行,程式碼如下
讓使用者輸入 身高及體重,計算後判斷BMI值,並將結果顯示於螢幕中

print('***************** BMI 計算 *****************')
height=int(input('請輸入身高(cm): '))
body_weight=int(input('請輸入體重(kg): '))
BMI=body_weight/((height/100)**2)
if BMI<=15:
    print(f'BMI= {BMI} , 非常嚴重的體重不足')
elif BMI<=16 and BMI>15 :
    print(f'BMI= {BMI} , 嚴重體重不足')
elif BMI<=18.5 and BMI>16 :
    print(f'BMI= {BMI} , 體重過輕')
elif BMI<=25 and BMI>18.5 :
    print(f'BMI= {BMI} , 體重正常')
elif BMI<=30 and BMI>25 :
    print(f'BMI= {BMI} , 體重過重')
elif BMI<=35 and BMI>30 :
    print(f'BMI= {BMI} , 肥胖I級(中等肥胖)')
elif BMI<=40 and BMI>35 :
    print(f'BMI= {BMI} , 肥胖II級(嚴重肥胖)')
else:
    print(f'BMI= {BMI} , 肥胖III級(非常嚴重肥胖)')

#***************執行結果**********************

***************** BMI 計算 *****************
請輸入身高(cm): 162
請輸入體重(kg): 56
BMI= 21.338210638622158 , 體重正常


程式還可以寫得更完整,如判斷使用者輸入的是否符合我們的需求cm 或是kg