基本語法

      在〈基本語法〉中尚無留言

print

print(“5+3/2 = “, 5+3/2, “計算結束)

列印每一個字串或運算,  使用 “,” 分開, 此時 “,” 會產生一個空格, 所以上述結果如下

5+3/2= 6.5 計算結束

不換行

print預設是會直接換行. 如果不希望換行的話, 可以第二參數加入 end=”

print("第一行", end='')
print(",第二行")

清除print

每次列印時想要在同一行顯示資料,則必需先清除原本的資料,再重新列印。’\r’ 是回歸到本行最前面,然後記得 end=”表示不換行。

import time
import random
for i in range(1000000):
    print(f'\r{random.randint(1, 10000)}', end='')
    time.sleep(0.001)
print()

輸入

a=input(‘請輸入一個字串 : ‘)

請注意, 輸入的型態是字串. 所以a存放的是字串型態. 因此 a 無法使用算式運算子進行四則運算。

如果輸入的是整數,則必需使用 a =int(input())轉成整數。
如果輸入的是小數,則必需使用 a=float(input())轉成小數。
但我們怎麼知道使用者會輸入小數或整數呢? 此時可以不用管,直接用 a=eval(input()),依狀況自動轉成整數或小數。

格式化列印

第一種

使用 %f 代表小數,%d 代表整數,%s代表字串。然後字串與變數之間,使用  % 隔開。
請注意,變數需使用tuple型態包含住

price=eval(input('請輸入單價 : '))
qty=eval(input('請輸入數量 : '))
print('單價 =%f, 數量 = %d, 總價 = : %f' % (price,qty, price*qty))
print('單價 =%-5.2f, 數量 = %d, 總價 = : %.2f' % (price,qty, price*qty))

第二種

使用 {0}代表第一個變數。這種方式是學C#的語法。整個字串後面加上 .format()方法,然後將變數放在format()裏面

price=eval(input('請輸入單價 : '))
qty=eval(input('請輸入數量 : '))
print('單價 ={0:<5.2f}, 數量 = {1}, 總價 = : {2}'.format(price,qty, price*qty))

第三種

在字串前加入 f”, 然後將變數寫在{variable}之內. f是代表 format(格式化)的意思

price=eval(input('請輸入單價 : '))
qty=eval(input('請輸入數量 : '))
print(f'單價 ={price}, 數量 = {qty}, 總價 = : {price*qty}')

變數型別

變數如同一個袋子, 裏面可以裝著不同的東西. 不論是裝什麼, 我們統稱為 a 袋子, b袋子. 所以 a, b為這個變數的名稱

Python是弱型語言, 使用變數前不需要宣告型別. 比如 a=10, 裏面裝的是整數, 但下一行可以又變成 a=’abc’

常見的型別如下

整數

10 進位 :  1, 100, -900,
16進位 : 0xff00 , 比如print(0xff) , 就會列出 255的10進位
2進位 : 0b1111 , print(0b1111), 會印出15

浮點數

數學表示 : 1.23, -5.3
科學符號 : 1.56e9 , 就是 1.56 * 109

字串

使用 “” 或 ” 包含起來, 如 “student”, ‘John’
如果字串中有包含 ‘ or ” 可使用如下
1. “I am ‘John'”  or ‘I am “John”‘
2. “I am \”John\””
\為轉義字符, 比如 \n, \t, \\

若不想要 \ 作為轉義符, 可使用 r’I am \n John’  此時會印出 \n, 而不是換行

如果希望列印換行, 且代碼也有換行, 可使用 ”’,  如下
print(”’
line1
line2
line3
”’)

布林值

使用True, False表示, 比如 print(3>2) 結果是 True
可搭配 and , or, not 作運算
a=False, 則a為布林值

. 代碼是有區分大小寫的. #為單行註解. 每行後面不需要 “;”作結尾

 空值

使用None表示

區域變數與全域變數

下面代碼有一個全域變數 count, 另二個函數. count可以橫跨二個函數. test()有一個a的區域變數, 當離開test()後, a 立即死亡, 所以在get()無法使用 a 變數.

另在test()中, 若沒有宣告 global count就直接 count=500, 那表示是要在test()裏產生一個區域變數 count. 所以此時有一個全域變數count(100), 以即一個區域變數 count(500).  離開test()後 count(500)就死亡, 只剩下全域變數的count(100), 因為get出來還是100.

但如果在test()裏加上global count的話, 就是在宣告底下的count是上面的全域變數, 所以get出來才會是500

count=100
def test():
    a=10
    global count
    count=500
def get():
    return count
test()
print(get())

強弱型之爭

強型語言必需名確規定變數型別, 規定後就不可再改變. 又稱為靜態語言. 弱型語言則不強制規定型別, 可隨時變來變去的, 又稱為動態語言.

強弱型各有其優缺點. 這二間的戰爭, 屬於學術上的爭辯. 但如果是只是因為弱型語言不分型別, 比較簡單使用. 那麼筆者建議您直接轉行到別的行業, 程式這領域不適合您.

比爾蓋茲當初就是因為不太會用C語言, 所以叫他的工程師創造了舉世無雙的垃圾~~Basic/Visual Basic. 這種出來亂世的世紀垃圾, 就是標榜著不分型別的特性, 也因此引發了後續許多無法收山的爛攤子.

變數命名規則

一個專案的完成, 有時在變數的命名上就會花上大半的時間. 通常在撰寫過程式, 會發現命名不太合理, 會導致日後維護的困難, 繼而就會一邊撰寫一邊修改變數名稱. 所以在變數的命名上,  還是建議遵循如下規則

1.  使用匈牙利命名法, 首字小寫, 第二單字首字大寫. 如 mScore, thisIsABook
2. 中間不可使用!@#$%等特殊符號, 也不可使用空格
3. 首字不可使用數字, 如 58score.  但如果是score58 則ok
4. 中間可使用底線, 如this_is_a_book. 通常這是C語言的慣用法
5. 首字可以為底線, 但不建議. 因這是系統核心程式碼的慣用法
6.  類別名稱, 首字大寫. 如 System, FirstApp

指定運算子 “=”

指定運算子   “=” ,這是程式的 原點

比如 x = x+2,這個  “=”, 不是數學符號的等於,而是 右邊的值放到左邊

請切記這個原點,當你看不懂程式的寫法時,一定要回想起這個 “原點”

常數

一般語言常使用大寫標示一個不可變更的數字, 稱為常數, 如  PI=3.14159.

在Python中, 並沒有常數這個觀念, 上述就算你重新更改其值, 也沒問題. 所以在Python中, 使用大寫標示, 只是一個慣用法而以.

註解

# 單行註解

#是單行註解, 而三個 ” (雙引號) 則可區塊註解

"""
這是第一行註解
這是第二行註解
"""

Colon :

看一下如下代碼, 在 if 後面的 “:” 緊接著有二行內縮, 表示條件成立後要執行的區塊. else 後面也有 “:” 內縮的那二行是條件不成立時要執行的區塊.

而沒有內縮的那行, 則是條件不論為何,  都會執行

a =10
if a<= 10:
    print("超便宜")
    print("買到賺到")
else :
    print("貴死人")
    print("搶劫啊")
print("要結束了")

除法

Python的除法, 如10/3, 是使用小數進行運算, 所以結果是 3.3333333
如果只想取得相除後整數的值, 可以使用 10//3 =3
另外Python也支援餘數求法, 10%4, 結果是2

數字大小限制

Python的整數,  沒有大小的限制. 但小數在到達一定的值, 就會變成inf, 無限大

++/ – –

++/ – – 是直接對CPU裏面的暫存器(Register)進行加減1的精簡指令. 但Python本身是以物件為參考, 所以並不支援 i++, i – – 的語法.  只能寫成 i+=1;

*

*不就是乘法嗎, 有啥好講的! 其實 * 還可以代表函數裏的不定數參數, 如下

def sum(*args):
    total=0;
    for value in args:
        total+=value
    return total
print(sum(*(range(1,11))))

請注意, 最後面的 *(range(1,11)), 那個 “*”並不是不小心打上去的, 而是當我們將參數傳入sum時, 必需是 sum(1,2,3,4,5), 要一個一個寫. 那麼我們用range(1,11)所產生的list, 是要怎麼拆開啊. 所以就用 “*” 拆成一個一個參數放進去

**

** 是Python的指數運算子, 如下

print(2**10)
print(9**(0.5))
結果 : 
1024
3.0

另外, **也是不確定dict數, 如下

def f4(**args):
    for key in args:
        print(key, args[key])
f4(name="Thomas", age=18, score=100)
結果 : 
name Thomas
age 18
score 100

冪次方

$(pow(x, y) = x^{y})$
$(pow(x, 1/y) = \sqrt[y]{x})$

int()

將小數轉換為整數, 即無條件去除小數尾數. 若要保留小數位數, 比如小數2位, 就乘100, 去除尾數後, 再除回100

print(int(2.9999))
print(int(0.12345*100)/100)
結果:
2
0.12

round()

這是四捨五入的函數. round(x, n), x為要處理的數字, n為要保留的位數. 比如round(1.235,2), 結果會是1.24
但其實round()是一個非常不可靠的函數, 常常會計算錯誤, 比如

print(round(1.115,2)), 結果卻是 ==> 1.11

查了許多網路上的說明, 最常看到的說法是~~四捨六入五平分. 本人驗証這種說法是~~放屁

真正的原因是, 1.115存在記憶体的實際內容是
1.1149999999999999911182158029987476766109466552734375
那麼, 廢話, 保留小數二位後的四捨五入, 當然是1.11

那怎麼辦呢??? 是有個方法, 但也不能保証. 比如要保留2位小數, 那就乘100, 四捨五入成整數後, 再除100. 比如
round(1.115*100)/100,  那結果就是正確的1.12了

但又為什麼不能保証呢. 因為
2.135*100結果是 213.49999999999997
唉, 所以才說, 不能保証的咩

Decimal

Decimal可以更加精準到28位數, 所以在四捨五入就不會出問題. 但速度慢.

請注意, 傳入Decimal裏的值, 必需是字串. 如果傳如小數,  一樣會有誤差

from decimal import Decimal
a=Decimal("1.115")
print(round(a,2))

datetime

datetime 可以取得目前系統時間的格式

from datetime import datetime
print(datetime.now())
print('年 : {}'.format(datetime.now().year))
print('月 : {}'.format(datetime.now().month))
print('日 : {}'.format(datetime.now().day))
print('時 : {}'.format(datetime.now().hour))
print('分 : {}'.format(datetime.now().minute))
print('秒 : {}'.format(datetime.now().second))
print('ms : {}'.format(datetime.now().microsecond))
結果 : 
2021-09-28 02:25:45.738543
年 : 2021
月 : 9
日 : 28
時 : 2
分 : 25
秒 : 45
ms : 738543

time.time()

取得目前時間, 格式為time stamp. time stamp為1970/01/01 0:0:0到現在所經過的秒數, 約15億秒多

import time
print(time.time())
結果 :
1559310582.0635796

time.sleep()

將本執行緒停頓, 單位為秒. 那如果要小睡10 ms呢, 那當然是time.sleep(0.01)

import time
t1=time.time()
time.sleep(3)
t2=time.time()
print(t2-t1)
結果:
3.0009732246398926

random.random()

產生一個亂數, 此亂數範圍為 0<=rnd<1. 若要產生某範圍內的整數, 則使用公式
int(rnd*數量)+偏移量

如下代碼, 會產生介於50~100之間的數, 總數量為 100-50+1=51

import random
r=random.random()
print(int(r*51)+50)

random.randint()

randint()是為了簡化上述random.random()的計算,先看一下如下範例

a=random.ranint(1,100)

此方法會產生介於 1~100之間的整數亂數,其值包含了1及100。 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *