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。