1. 程式人生 > >python3 基礎概念

python3 基礎概念

small obj 如果 公司 不可變類 col targe 形象 height

一、3.x新特性


1、print (),打印,3.x必須加括號 2、raw_input,3.x改為input

二、簡介

Python是著名的“龜叔”Guido van Rossum在1989年聖誕節期間,為了打發無聊的聖誕節而編寫的一個編程語言。許多大型網站就是用Python開發的,例如YouTube、Instagram,還有國內的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國航空航天局)都大量地使用Python。Python就為我們提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、GUI、數據庫、文本等大量內容,被形象地稱作“內置電池(batteries included)”。用Python開發,許多功能不必從零編寫,直接使用現成的即可。

適用於:

1、網絡應用,包括網站、後臺服務等等;

2、日常需要的小工具;

3、把其他語言開發的程序再包裝起來。

優點:

開源免費、強大的基礎代碼庫、簡單。

缺點:

1、運行速度慢。

2、代碼不能加密。

三、數據類型:

1、整型:

Python可以處理任意大小的整數,當然包括負整數,在程序中的表示方法和數學上的寫法一模一樣,例如:1100-80800,等等。

計算機由於使用二進制,所以,有時候用十六進制表示整數比較方便,十六進制用0x前綴和0-9,a-f表示,例如:0xff000xa5b4c3d2,等等。

2、浮點型:

浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如,1.23x109和12.3x108是相等的。浮點數可以用數學寫法,如1.23

3.14-9.01,等等。但是對於很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。

整數和浮點數在計算機內部存儲的方式是不同的,整數運算永遠是精確的(除法難道也是精確的?是的!),而浮點數運算則可能會有四舍五入的誤差。

3、字符串:

(1)字符串是以‘‘或""括起來的任意文本,可以用“\”轉義符來轉義特殊字符。

(2)Python還允許用r‘‘表示‘‘內部的字符串默認不轉義。

(3)如果字符串內部有很多換行,用\n寫在一行裏不好閱讀,為了簡化,Python允許用‘‘‘...‘‘‘
的格式表示多行內容。

(4)Python中,Unicode表示的字符串用u‘...‘表示。

兩種字符串如何相互轉換?字符串‘xxx‘雖然是ASCII編碼,但也可以看成是UTF-8編碼,而u‘xxx‘則只能是Unicode編碼。

u‘xxx‘轉換為UTF-8編碼的‘xxx‘encode(‘utf-8‘)方法:

>>> u‘ABC‘.encode(‘utf-8‘)
‘ABC‘
>>> u‘中文‘.encode(‘utf-8‘)
‘\xe4\xb8\xad\xe6\x96\x87‘

英文字符轉換後表示的UTF-8的值和Unicode值相等(但占用的存儲空間不同),而中文字符轉換後1個Unicode字符將變為3個UTF-8字符,你看到的\xe4就是其中一個字節,因為它的值是228,沒有對應的字母可以顯示,所以以十六進制顯示字節的數值。len()函數可以返回字符串的長度:

>>> len(u‘ABC‘)
3
>>> len(‘ABC‘)
3
>>> len(u‘中文‘)
2
>>> len(‘\xe4\xb8\xad\xe6\x96\x87‘)
6

反過來,把UTF-8編碼表示的字符串‘xxx‘轉換為Unicode字符串u‘xxx‘decode(‘utf-8‘)方法:

>>> ‘abc‘.decode(‘utf-8‘)
u‘abc‘
>>> ‘\xe4\xb8\xad\xe6\x96\x87‘.decode(‘utf-8‘)
u‘\u4e2d\u6587‘
>>> print ‘\xe4\xb8\xad\xe6\x96\x87‘.decode(‘utf-8‘)
中文

由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

Try

第一行註釋是為了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;

第二行註釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。

(5)、字符串的格式化:

在Python中,采用的格式化方式和C語言是一致的,用%實現,舉例如下:

>>> ‘Hello, %s‘ % ‘world‘
‘Hello, world‘
>>> ‘Hi, %s, you have $%d.‘ % (‘Michael‘, 1000000)
‘Hi, Michael, you have $1000000.‘

你可能猜到了,%運算符就是用來格式化字符串的。在字符串內部,%s表示用字符串替換,%d表示用整數替換,有幾個%?占位符,後面就跟幾個變量或者值,順序要對應好。如果只有一個%?,括號可以省略。

常見的占位符有:

%d 整數
%f 浮點數
%s 字符串
%x 十六進制整數

其中,格式化整數和浮點數還可以指定是否補0和整數與小數的位數:

>>> ‘%2d-%02d‘ % (3, 1)
‘ 3-01‘
>>> ‘%.2f‘ % 3.1415926
‘3.14‘

如果你不太確定應該用什麽,%s永遠起作用,它會把任何數據類型轉換為字符串:

>>> ‘Age: %s. Gender: %s‘ % (25, True)
‘Age: 25. Gender: True‘

對於Unicode字符串,用法完全一樣,但最好確保替換的字符串也是Unicode字符串:

>>> u‘Hi, %s‘ % u‘Michael‘
u‘Hi, Michael‘

有些時候,字符串裏面的%是一個普通字符怎麽辦?這個時候就需要轉義,用%%來表示一個%

>>> ‘growth rate: %d %%‘ % 7 

‘growth rate: 7 %‘

4、布爾值:

布爾值和布爾代數的表示完全一致,一個布爾值只有TrueFalse兩種值,要麽是True,要麽是False,在Python中,可以直接用TrueFalse表示布爾值(請註意大小寫)。

布爾值可以用and(&)or(|)not運算。

5、空值

空值是Python裏一個特殊的值,用None表示。None不能理解為0,因為0是有意義的,而None是一個特殊的空值。

6、列表(list)

類似java的數組,可以使用len獲取長度,使用pop方法刪除元素,使用insert插入元素,使用append添加元素:

  1. >>> array = [‘a‘, ‘b‘, ‘c‘]
  2. >>> array
  3. [‘a‘, ‘b‘, ‘c‘]
  4. >>> len(array)
  5. 3
  6. >>> array.append(‘d‘)
  7. >>> array
  8. [‘a‘, ‘b‘, ‘c‘, ‘d‘]
  9. >>> array.pop()
  10. ‘d‘
  11. >>> array
  12. [‘a‘, ‘b‘, ‘c‘]
  13. >>> array[-1]
  14. ‘c‘
  15. >>> array[-3]
  16. ‘a‘
  17. >>> array.insert(1,‘d‘)
  18. >>> array
  19. [‘a‘, ‘d‘, ‘b‘, ‘c‘]
  20. >>> array.append([‘e‘, ‘f‘])
  21. >>> array
  22. [‘a‘, ‘d‘, ‘b‘, ‘c‘, [‘e‘, ‘f‘]]
  23. >>> array[4][1]
  24. ‘f‘
  25. >>>

7、元組(tuple):

與list類似 一旦定義,引用不可變,裏邊的內容可以變。

要定義一個只有1個元素的tuple,須加上”,“,以區別數學上的小括號:

  1. >>> t = (1)
  2. >>> t
  3. 1
  4. >>> t = (1,)
  5. >>> t
  6. (1,)

引用不變,內容可變:

  1. >>> t = (‘a‘, ‘b‘, ‘c‘)
  2. >>> t[0]
  3. ‘a‘
  4. >>> t[0] = ‘d‘
  5. Traceback (most recent call last):
  6. File "<pyshell#57>", line 1, in <module>
  7. t[0] = ‘d‘
  8. TypeError: ‘tuple‘ object does not support item assignment
  9. >>> t = (‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘])
  10. >>> t
  11. (‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘])
  12. >>> t[3][1] = ‘f‘
  13. >>> t
  14. (‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘f‘])
  15. >>>

8、字典

8、字符編碼:

如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。

所以,本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:

字符ASCIIUnicodeUTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

從上面的表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作。

搞清楚了ASCII、Unicode和UTF-8的關系,我們就可以總結一下現在計算機系統通用的字符編碼工作方式:

在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼。

用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換為UTF-8保存到文件:

技術分享

瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器:

技術分享

所以你看到很多網頁的源碼上會有類似<meta charset="UTF-8" />的信息,表示該網頁正是用的UTF-8編碼。

四、變量

動態語言,變量類型不固定。

  1. var = 123
  2. print (‘var =‘, var)
  3. var = ‘abc‘
  4. print (‘var =‘, var)

五、常量

通常全部大寫表示常量,實際上也是一個變量。例如:PI = 3.14

六、條件語句

格式:

  1. if 條件:
  2. 處理語句
  3. elif 條件:
  4. 處理語句
  5. else
  6. 處理語句

elif是else if的縮寫,用於進行分支條件判斷,例如:

  1. #~ 條件判斷語句
  2. # 將輸入的字符串轉為int
  3. a = int(input(‘please enter a number :‘));
  4. if a > 0:
  5. print (‘a > 0‘)
  6. elif a < 0:
  7. print (‘a < 0‘)
  8. else :
  9. print (‘a = 0‘)

七、循環語句

Python有兩種循環:

1、for ... in循環:

格式:

  1. for 變量 in 循環對象:
  2. 處理語句

例如:

  1. #~ 循環語句
  2. # for in循環
  3. arr = [‘a‘, ‘b‘, ‘c‘]
  4. for v in arr:
  5. print (v)
  6. # 求1 + 2 + 3 + ... + 100
  7. sum = 0
  8. for v in range(101):
  9. sum += v
  10. print (‘sum = ‘, sum)

2、while循環:

格式:

  1. while 條件:
  2. 處理語句

例:

  1. # while循環
  2. n = 100
  3. sum = 0
  4. while True:
  5. if n == 0:
  6. break
  7. sum += n
  8. n = n - 1
  9. print (‘sum = ‘, sum)

八、dict:

Python的字典,采用鍵值對的方式存放,類似java的map。查找速度快,占用資源多,鍵值對存放無序。

例如:

  1. >>> map = {‘a‘ : 1, "b" : 2}
  2. >>> map
  3. {‘a‘: 1, ‘b‘: 2}
  4. >>> map["b"]
  5. 2
  6. >>> map["c"] = 3
  7. >>> map
  8. {‘a‘: 1, ‘c‘: 3, ‘b‘: 2}
  9. >>> map["d"] = 4
  10. >>> map
  11. {‘a‘: 1, ‘c‘: 3, ‘d‘: 4, ‘b‘: 2}
  12. >>>
新增的“c”、“d”鍵值對在map的存放並不是後增的,而是采用hash來計算存放地址。

判斷鍵是否在dict中,可有用in語句,或者用get方法:

  1. >>> "a" in map
  2. True
  3. >>> map.get("a")
  4. 1
  5. >>> map.get("e")
  6. >>> map["e"]
  7. Traceback (most recent call last):
  8. File "<pyshell#102>", line 1, in <module>
  9. map["e"]
  10. KeyError: ‘e‘
  11. >>>
鍵“e”在map中不存在,所以map["e"]獲取時會報錯,而map.get("e")返回空值:

  1. >>> map.get("e") == None
  2. True
  3. >>> map.get("e") == ""
  4. False

dict中存放的key不能重復,且一個key只能有一個value與之對應,後賦的值會覆蓋前邊的值:

  1. >>> map["e"] = 5
  2. >>> map
  3. {‘a‘: 1, ‘c‘: 3, ‘d‘: 4, ‘b‘: 2, ‘e‘: 5}
  4. >>> map["e"] = 6
  5. >>> map
  6. {‘a‘: 1, ‘c‘: 3, ‘d‘: 4, ‘b‘: 2, ‘e‘: 6}
  7. >>>

九、set:

set結構,元素不能重復,且無順序,支持add、remove等方法來添加和移除元素,同時,set可以很方便的求並、交、差集:

  1. >>> list = [1, 2, 3]
  2. >>> s = set(list)
  3. >>> s
  4. {1, 2, 3}
  5. >>> s.add(4)
  6. >>> s
  7. {1, 2, 3, 4}
  8. >>> s.remove(2)
  9. >>> s
  10. {1, 3, 4}
  11. >>> s1 = set(1,2,3)
  12. Traceback (most recent call last):
  13. File "<pyshell#8>", line 1, in <module>
  14. s1 = set(1,2,3)
  15. TypeError: set expected at most 1 arguments, got 3
  16. >>> s1 = set([1, 2, 3])
  17. >>> s2 = set([2, 3, 4])
  18. >>> s1 & s2
  19. {2, 3}
  20. >>> s1 - s2
  21. {1}
  22. >>> s2 - s1
  23. {4}
  24. >>> s1 | s2
  25. {1, 2, 3, 4}
  26. >>> s1 ^ s2
  27. {1, 4}
  28. >>>

**可變對象和不可變對象

Python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指,對象的內容可變,而不可變對象是指對象內容不可變。

不可變(immutable):int、字符串(string)、float、(數值型number)、元組(tuple)

可變(mutable):字典型(dictionary)、列表型(list)

不可變類型特點:

  看下面的例子(例1)

  1. i = 73
  2. i += 2

技術分享
從上圖可知,不可變對象的特征沒有變,變的只是創建了新對象,改變了變量的對象引用。

  看一個例子(例2)

>>>x = 1
>>>y = 1
>>>x = 1
>>> x is y
True
>>>y is z
True

  如上所示,因為整數為不可變,x,y,z在內存中均指向一個值為1的內存地址,也就是說,x,y,z均指向的是同一個地址,值得註意的是,整形來說,目前僅支持(-1,100)。

  總結一下,不可變對象的優缺點。

    優點是,這樣可以減少重復的值對內存空間的占用

    缺點呢,如例1所示,我要修改這個變量綁定的值,如果內存中沒用存在該值的內存塊,那麽必須重新開辟一塊內存,把新地址與變量名綁定。而不是修改變量原來指向的內存塊的值,這回給執行效率帶來一定的降低。

  下面看一個可變對象的例子(例3)

m=[5,9]
m+=[6]

技術分享

python3 基礎概念