楊皓丞
編譯語言 | 直譯語言 |
---|---|
編譯器將程式碼編譯(compile)成機器碼,產生一個執行檔 | 直譯器一行一行將程式碼直譯(interpret)成機器碼並執行 |
只要程式碼中有語法錯誤就無法編譯成功,完全無法執行 因此較難debug |
出現語法錯誤那行之前的code都會正常執行,直到遇到錯誤 因此較易debug |
執行效率較高 | 執行效率較低 |
C/C++ | python |
a = 3
b = 3.5
c = 5
d = 2
a + b
#output : 8
a - c
#output : -2
a * c
#output : 15
a / c
#output : 0.6
c % d
#output : 1
#整數除法取餘數
c ** a
#output : 125
#指數運算
c // d
#output : 2
#整數除法取商
int/float大部分的使用上都跟C相同,大家有察覺哪些差異呢?
x = 3
x = x + 1
x
#output : 4
x += 1
x
#output : 5
x ++
# Syntax Error: invalid syntax
a, b = 3, 5
a
#output : 3
b
#output : 5
a, b = b, a
a
#output : 5
b
#output : 3
a = ['hello', 1, 3.0]
a[0]
#output : hello
a[-1]
#output : 3.0
a[1] = 2
a
#output : ['hello', 2, 3.0]
b = [1, 2, 3, 4, 5, 6]
b[1:]
#output : [2, 3, 4, 5, 6]
b[:3]
#output : [1, 2, 3]
b[1:5]
#output : [2, 3, 4, 5]
b[1:5:2]
#output : [2, 4]
b[::-1]
#output : [6, 5, 4, 3, 2, 1]
b[?:?:?]
#output : [5, 4, 3, 2]
list是序列,類似C中的陣列,但功能上較為廣泛
請大家觀察list和C中array的不同
a = [1, 2, 3]
b = [4, 5]
a + b
#output : [1, 2, 3, 4, 5]
a * 2
#output : [1, 2, 3, 1, 2, 3]
a = b = 3
a += 1
a
#output : ?
b
#output : ?
a = b = [1, 2]
a += [3]
a
#output : ?
b
#output : ?
a = ['hello', 1, 3.0]
a[0]
#output : hello
a[-1]
#output : 3.0
a[1] = 2
a
#output : ['hello', 2, 3.0]
b = [1, 2, 3, 4, 5, 6]
b[1:]
#output : [2, 3, 4, 5, 6]
b[:3]
#output : [1, 2, 3]
b[1:5]
#output : [2, 3, 4, 5]
b[1:5:2]
#output : [2, 4]
b[::-1]
#output : [6, 5, 4, 3, 2, 1]
b[4:0:-1]
#output : [5, 4, 3, 2]
a = [1, 2, 3]
b = [4, 5]
a + b
#output : [1, 2, 3, 4, 5]
a * 2
#output : [1, 2, 3, 1, 2, 3]
a = b = 3
a += 1
a
#output : 4
b
#output : 3
a = b = [1, 2]
a += [3]
a
#output : [1, 2, 3]
b
#output : [1, 2, 3]
a = "hello"
b = "world"
a + b
#output : hello world
a * 3
#output : hellohellohello
a[1]
#output : e
c = a + ' ' + b + '!'
c
#output : hello world!
c[0] = 'H'
#output : TypeError: 'str' object does not support item assignment
字串的使用上都也跟C差不多,也跟list很像,不過有個顯著的差異!
#include<stdio.h>
int main(){
printf("資工系桌招募新生中,女生不用繳隊費喔!\n");
printf("印完不會自己");
printf("換行\n");
return 0;
}
//output:
//資工系桌招募新生中,女生不用繳隊費喔!
//印完不會自己換行
//
C
python
print("資工系桌招募新生中,女生不用繳隊費喔!")
print("預設是")
print("會換行")
print("這樣才會", end = '')
print("不換行")
#印出多項
print(3, [0, 1], "hello")
print(3, [0, 1], "hello", sep = '')
print('cindy', '0345', sep = '_')
#output:
#資工系桌招募新生中,女生不用繳隊費喔!
#預設是
#會換行
#這樣才會不換行
#3 [0, 1] hello
#3[0, 1]hello
#cindy_0345
a = input()
#input : hello world
print(a)
#output : hello world
b = input('please enter a number')
#output : please enter a number|
#input : 35
print(b + 5)
#Type Error : 字串跟整數無法做加法
input就是python的標準輸入,跟scanf不同的是,input只能單純把一整行輸入當作字串吃進來,比較像C中的gets
但由於吃進來的型態是str,沒辦法當作int做加法,我們要怎麼改變b的型態呢?
b = input()
#input : 35
print(type(b))
#output : <class 'str'>
b = int(b)
print(type(b))
#output : <class 'int'>
print(b + 5)
#output : 40
x, y = 12, 34
z = int(str(x) + str(y))
print(z)
#output : 1234
c = 1.3
d = int(c)
print(d)
#output : 1
跟C中的強制轉型很像,但python的轉型更泛用,能夠直接把數字和字串互轉
a = 'hello'
b = int(a)
#error
# ASCII值和字元互轉
print(ord('0'))
#output : 48
print(chr(97))
#output : a
>>> 2 < 3
True
>>> 4 < 3
False
>>> 2 == 2
True
>>> 2 >= 2
True
>>> 3 <= 2
False
>>> 2 != 2
False
>>> 5 > 3 > 1
True
>>> 7 > 5 < 8 > 2
True
>>> 3 < 2 > 1
False
bool基本上就是True或是False,判斷式的回傳值都是bool,基本上跟C/C++中的邏輯相同
>>> not True
False
>>> not False
True
>>> 3 >= 2 and 3 >= 1
True
>>> 2 >= 3 and 2 >= 1
False
>>> 3 < 2 or 3 < 1
False
>>> 3 > 2 or 3 < 1
True
>>> True or False and False
???
>>> not True
False
>>> not False
True
>>> 3 >= 2 and 3 >= 1
True
>>> 2 >= 3 and 2 >= 1
False
>>> 3 < 2 or 3 < 1
False
>>> 3 > 2 or 3 < 1
True
>>> True or False and False
True
#但盡量不要寫出這種東西...
year = input()
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
print('閏年')
else:
print('平年')
else:
print('閏年')
else:
print('平年')
就是C中的if/else if/else,只要注意一開始提到的,python中段落是以冒號和縮排區分的就好
i = 1
while i <= 100:
print(i)
i += 1
'''
output:
1
2
3
4
...
100
'''
python的loop一樣有while/for兩種,其中while基本上跟C的一樣
for i in [iterable]:
do event
#常見的iterable有range以及list兩種
for的使用上就有點不同,C中的for只是為方便把while中會分開寫的變數宣告,執行條件,變數增值寫在一起。python中的for則是讓變數去迭代一個可迭代物件(iterable)
可迭代物件就是可以讓變數從裡面一個一個的取值
range函式可以接1~3個參數,range(a, b, c)的意思就是從a開始迭代,每次加c,直到達到或超過b就停止
可以想成是C中的for(i = a; i < b; i += c)
for i in range(1, 7, 2):
print(i)
'''
output:
1
3
5
'''
for i in range(1, 4):
print(i)
'''
省略一個參數時,預設c = 1
output:
1
2
3
'''
for i in range(3):
print(i)
'''
省略兩個參數時,預設a = 0
output:
0
1
2
'''
ary = [1, 4, 5, 3]
for i in ary:
print(i)
'''
output:
1
4
5
3
'''
for i in range(len(ary)):
print(ary[i])
'''
output:
1
4
5
3
'''
前面講過的list也是可迭代物件,迭代方式就是一個一個從list拿出來,注意C和python中用for迭代iterable本身/迭代索引值的用法差異
int ary[4]={1, 4, 5, 3};
for(int i = 0; i < 4; i ++)
printf("%d\n",ary[i]);
/*
output:
1
4
5
3
*/
for(int i : ary)
printf("%d\n",i);
/*
output:
1
4
5
3
*/
print(type([0, 1, 2]))
#output : <class 'list'>
print(type(range(3)))
#output : <class 'range'>
lst = list(range(1, 10, 2))
print(lst)
#output : [1, 3, 5, 7, 9]
在python3中,range所做的事並非產生一個list,也就是range(1000000)並不會開啟1000000格記憶體空間。
不過range可以轉型成list
for n in range(2, 10):
is_prime = True
for x in range(2, n):
if n % x == 0:
print(n, 'equals', x, '*', n//x)
is_prime = False
break
if is_prime:
print(n, 'is a prime number')
用法跟C完全一樣!不過python的迴圈有個方便的else功能,在迴圈自然結束後會執行,可以取代在C中我們常常要用flag去紀錄迴圈是否是被break出來的
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print(n, 'equals', x, '*', n//x)
break
else:
print(n, 'is a prime number')
>>> lst = [3, 1, 2, 4]
>>> max(lst)
4
>>> min(lst)
1
>>> sum(lst)
10
>>> lst.index(4)
3
>>> lst.remove(3)
>>> lst
[1, 2, 4]
>>> lst.pop(1)
2
>>> lst
[1, 4]
>>> lst.append(5)
>>> lst
[1, 4, 5]
>>> len(lst)
3
>>> lst = [3, 1, 2, 4]
>>> sorted(lst)
[1, 2, 3, 4]
>>> sorted(lst, reverse = True)
[4, 3, 2, 1]
>>> lst
[3, 1, 2, 4]
>>> lst.sort()
>>> lst
[1, 2, 3, 4]
>>> str = "Hello my name is Howard"
>>> lst = str.split(' ')
>>> lst
['Hello', 'my', 'name', 'is', 'Howard']
>>> str = 'cindy_0345'
>>> lst = str.split('_')
>>> lst
['cindy', '0345']
def add1(x, y):
return x + y
def add2(x, y):
x += y
x, y = 3, 2
print(add1(x, y))
print(x)
print(add2(x, y))
print(x)
x, y = [1, 2], [3, 4]
print(add1(x, y))
print(x)
print(add2(x, y))
print(x)
使用方式跟C也差不多,一樣注意不用宣告函數和參數的型態,還有用冒號和縮排就好
output:
?
?
?
?
?
?
?
?
output:
5
3
None
3
?
?
?
?
output:
5
3
None
3
[1, 2, 3, 4]
[1, 2]
None
[1, 2, 3, 4]
def get_perimeter_and_area_of_rectangle(x, y):
return 2 * (x + y), x * y
peri, area = get_perimeter_and_area_of_rectangle(3, 5)
print(peri, area)
#output : 16, 15
def magnitude_of_vector(x, y, z = 0):
return (x ** 2 + y ** 2 + z ** 2) ** 0.5
m1 = magnitude_of_vector(3, 4)
m2 = magnitude_of_vector(1, 2, 2)
print(m1, m2)
#output : 5.0, 3.0
比起C,多了一次回傳多個值的功能,也多了optional argument的功能
def useless():
pass
if 1 < 3:
pass
for i in range(3):
pass
python中不允許一個段落是空的,不像C的段落中左右大括號中間可以是空的。因此有時候會用到pass這個關鍵字來代表什麼事都不做