作為微軟的粉絲,最后終於向Python低頭了,拖了兩三個月終於下定決心學習Python了。不過由於之前受到C/C#等語言影響的思維定式,前期有些東西理解起來還是很費了些功夫的。
零.先抄書:
1.Python是解釋型語言:
計算機是不能夠識別高級語言的,所以當我們運行一個高級語言程序的時候,就需要一個“翻譯機”來從事把高級語言轉變成計算機能讀懂的機器語言的過程。這個過程分成兩類,第一種是編譯,第二種是解釋。
編譯型語言在程序執行之前,先會通過編譯器對程序執行一個編譯的過程,把程序轉變成機器語言。運行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。
解釋型語言就沒有這個編譯的過程,而是在程序運行的時候,通過解釋器對程序逐行作出解釋,然后直接運行,最典型的例子是Ruby。
通過以上的例子,我們可以來總結一下解釋型語言和編譯型語言的優缺點,因為編譯型語言在程序運行之前就已經對程序做出了“翻譯”,所以在運行時就少掉了“翻譯”的過程,所以效率比較高。但是我們也不能一概而論,一些解釋型語言也可以通過解釋器的優化來在對程序做出翻譯時對整個程序做出優化,從而在效率上超過編譯型語言。
此外,隨着Java等基於虛擬機的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種。
用Java來舉例,Java首先是通過編譯器編譯成字節碼文件,然后在運行時通過解釋器給解釋成機器文件。所以我們說Java是一種先編譯后解釋的語言。
再換成C#,C#首先是通過編譯器將C#文件編譯成IL文件,然后在通過CLR將IL文件編譯成機器文件。所以我們說C#是一門純編譯語言,但是C#是一門需要二次編譯的語言。同理也可等效運用到基於.NET平台上的其他語言。
2.與大多數語言不同,python最具特色的就是使用縮進來表示代碼塊,不需要使用大括號 {} 。
縮進的空格數是可變的,但是同一個代碼塊的語句必須包含相同的縮進空格數。這也就是游標卡尺的梗的來源。
一.第一個Python程序:
先輸出Hello World,然后調用排序函數對一個list進行冒泡的升序排序,盡管程序結構簡單,但是包含了大多數的基礎語法
## coding=utf-8
##冒泡排序與HelloWorld list = [8,1,2,66,5,123] def BubbleSort(): for i in range(len(list)): for j in range(i): if list[j] > list[j+1]: list[j],list[j+1] = list[j+1],list[j] return list if __name__ == "__main__": print("hello world") list = BubbleSort() print(list)
程序的運行結果如下:
hello world
[1, 2, 5, 8, 66, 123]
為了方便對比,我們再使用C#的代碼實現同樣的功能:
class Program { static void Main(string[] args) { Console.WriteLine("Hello World"); BubbleSort(); } private static void BubbleSort() { int[] data = { 8, 1, 2, 66, 5, 123 }; for (int i = 0; i < data.Length - 1; i++) { for (int j = data.Length - 1; j > i; j--) { if (data[j] > data[j - 1]) { data[j] = data[j] + data[j - 1]; data[j - 1] = data[j] - data[j - 1]; data[j] = data[j] - data[j - 1]; } } } foreach (int i in data) { Console.Write(i + ","); } Console.ReadLine(); }
二.Python程序的程序結構
從上面我們可以大概看出,一個完整的py程序結構大概如下:

我們知道,對於C/C++/C#等編程語言來說,程序的入口一定是main()函數,但是如果沿用這種思路來理解python的話就很容易踩坑。
Python使用縮進對齊組織代碼的執行,所有沒有縮進的代碼(非函數定義和類定義),都會在載入時自動執行,這些代碼,都可以可以認為是Python的main函數。每個文件(模塊)都可以任意寫一些沒有縮進的代碼,並且在載入時自動執行,為了區分主執行文件還是被調用的文件,Python引入了一個變量__name__,當文件是被調用時,__name__的值為模塊名,當文件被執行時,__name__為'__main__'。因此,在之前的代碼中,我們基本上可以使用這種方式來設置main函數的調用。
三.常量與變量
1 常量:
py並沒有提供const關鍵字來定義變量,哭……
2 變量:
python的變量定義不需要聲明類型,直接name=value 就可以了,比如:
a=1 ##整型變量a b=0.02 ##浮點型變量b str = "Hello World" ##字符串c d=true ##布爾值d
py個人理解應該是故意在弱化變量的概念,當使用C#的思想去理解就出現了很大的偏差。
C/C++中的變量的概念是面向內存的,所以你要聲明一個變量,表明空間大小,存儲的格式(整數,浮點),以及一個永久不變的名字指向這個變量。而python只有name和object,比如a=1的語句,實際上做了三件微小的工作:
- 創建name a
- 創建object 1
- 將name a 關聯到1這個object
然后,就能夠直接使用a來調用1這個對象。至於強弱類型什么的,別糾結了吧……
py提供了type()函數來判斷變量的類型,如:
a, b, c, d = 20, 5.5, True, 4+3j
print(type(a), type(b), type(c), type(d))
執行結果如下:
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
3 數值類型:
python支持int(整型),longint(長整型),float(浮點)和complex(負數)四種類型的數值。
//碎碎念一句浮點只有float精度真的夠用么……
舉例:
a=10 ##int b=51924361L ##長整型,用大寫L結尾 c=15.20 ## 浮點 d=1+2j ##復數,用a+bj或complex(a,b)表示
4 字符串:
str = "Hello World" ##定義字符串 str1 = str[0:4] ##截取字符串,從上標到下標,注意下標從0開始
轉義符:

格式化輸出:py的格式化輸出用法與C語言的printf函數一樣:

四.列表與字典:
1.列表:
與聲明其他變量一樣,python在定義列表時不需要
List <int> list = new List<int>();
直接賦值即可:
list1 = ['physics', 'chemistry', 1997, 2000] list2 = [1, 2, 3, 4, 5 ] list3 = ["a", "b", "c", "d"]
與字符串的索引一樣,列表索引從0開始。列表可以進行截取、組合等。
常見的列表操作函數如下:

2.元組:元組類似於靜態列表,其中的元素不能修改。
3.字典:字典是鍵值對的集合,聲明字典時一樣不需要定義字典類型,也不需要new操作:
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
PS:1.字典的鍵不能重復,同時鍵是不會發生變化的。
2.python中向字典中增加值無需使用add方法,直接操作其鍵值即可:
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # 更新值
dict['School'] = "DPS School"; # 添加一個鍵值對
常見的字典函數如下:

