python3 基礎概念
一、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可以處理任意大小的整數,當然包括負整數,在程序中的表示方法和數學上的寫法一模一樣,例如:
1
,100
,-8080
,0
,等等。
計算機由於使用二進制,所以,有時候用十六進制表示整數比較方便,十六進制用0x
前綴和0-9,a-f表示,例如:0xff00
,0xa5b4c3d2
,等等。
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、布爾值:
布爾值和布爾代數的表示完全一致,一個布爾值只有
True
、False
兩種值,要麽是True
,要麽是False
,在Python中,可以直接用True
、False
表示布爾值(請註意大小寫)。布爾值可以用
and(&)
、or(|)
和not
運算。5、空值
空值是Python裏一個特殊的值,用None
表示。None
不能理解為0
,因為0
是有意義的,而None
是一個特殊的空值。
6、列表(list)
類似java的數組,可以使用len獲取長度,使用pop方法刪除元素,使用insert插入元素,使用append添加元素:
>>> array = [‘a‘, ‘b‘, ‘c‘]
>>> array
[‘a‘, ‘b‘, ‘c‘]
>>> len(array)
3
>>> array.append(‘d‘)
>>> array
[‘a‘, ‘b‘, ‘c‘, ‘d‘]
>>> array.pop()
‘d‘
>>> array
[‘a‘, ‘b‘, ‘c‘]
>>> array[-1]
‘c‘
>>> array[-3]
‘a‘
>>> array.insert(1,‘d‘)
>>> array
[‘a‘, ‘d‘, ‘b‘, ‘c‘]
>>> array.append([‘e‘, ‘f‘])
>>> array
[‘a‘, ‘d‘, ‘b‘, ‘c‘, [‘e‘, ‘f‘]]
>>> array[4][1]
‘f‘
>>>
7、元組(tuple):
與list類似 一旦定義,引用不可變,裏邊的內容可以變。
要定義一個只有1個元素的tuple,須加上”,“,以區別數學上的小括號:
>>> t = (1)
>>> t
1
>>> t = (1,)
>>> t
(1,)
引用不變,內容可變:
>>> t = (‘a‘, ‘b‘, ‘c‘)
>>> t[0]
‘a‘
>>> t[0] = ‘d‘
Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
t[0] = ‘d‘
TypeError: ‘tuple‘ object does not support item assignment
>>> t = (‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘])
>>> t
(‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘e‘])
>>> t[3][1] = ‘f‘
>>> t
(‘a‘, ‘b‘, ‘c‘, [‘d‘, ‘f‘])
>>>
8、字典
8、字符編碼:
如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。
所以,本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8
編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:
字符 | ASCII | Unicode | UTF-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編碼。
四、變量
動態語言,變量類型不固定。
var = 123
print (‘var =‘, var)
var = ‘abc‘
print (‘var =‘, var)
五、常量
通常全部大寫表示常量,實際上也是一個變量。例如:PI = 3.14
六、條件語句
格式:
if 條件:
處理語句
elif 條件:
處理語句
else
處理語句
elif是else if的縮寫,用於進行分支條件判斷,例如:
#~ 條件判斷語句
# 將輸入的字符串轉為int
a = int(input(‘please enter a number :‘));
if a > 0:
print (‘a > 0‘)
elif a < 0:
print (‘a < 0‘)
else :
print (‘a = 0‘)
七、循環語句
Python有兩種循環:
1、for ... in循環:
格式:
for 變量 in 循環對象:
處理語句
例如:
#~ 循環語句
# for in循環
arr = [‘a‘, ‘b‘, ‘c‘]
for v in arr:
print (v)
# 求1 + 2 + 3 + ... + 100
sum = 0
for v in range(101):
sum += v
print (‘sum = ‘, sum)
2、while循環:
格式:
while 條件:
處理語句
例:
# while循環
n = 100
sum = 0
while True:
if n == 0:
break
sum += n
n = n - 1
print (‘sum = ‘, sum)
八、dict:
Python的字典,采用鍵值對的方式存放,類似java的map。查找速度快,占用資源多,鍵值對存放無序。
例如:
>>> map = {‘a‘ : 1, "b" : 2}
>>> map
{‘a‘: 1, ‘b‘: 2}
>>> map["b"]
2
>>> map["c"] = 3
>>> map
{‘a‘: 1, ‘c‘: 3, ‘b‘: 2}
>>> map["d"] = 4
>>> map
{‘a‘: 1, ‘c‘: 3, ‘d‘: 4, ‘b‘: 2}
>>>
判斷鍵是否在dict中,可有用in語句,或者用get方法:
>>> "a" in map
True
>>> map.get("a")
1
>>> map.get("e")
>>> map["e"]
Traceback (most recent call last):
File "<pyshell#102>", line 1, in <module>
map["e"]
KeyError: ‘e‘
>>>
>>> map.get("e") == None
True
>>> map.get("e") == ""
False
dict中存放的key不能重復,且一個key只能有一個value與之對應,後賦的值會覆蓋前邊的值:
>>> map["e"] = 5
>>> map
{‘a‘: 1, ‘c‘: 3, ‘d‘: 4, ‘b‘: 2, ‘e‘: 5}
>>> map["e"] = 6
>>> map
{‘a‘: 1, ‘c‘: 3, ‘d‘: 4, ‘b‘: 2, ‘e‘: 6}
>>>
九、set:
set結構,元素不能重復,且無順序,支持add、remove等方法來添加和移除元素,同時,set可以很方便的求並、交、差集:
>>> list = [1, 2, 3]
>>> s = set(list)
>>> s
{1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.remove(2)
>>> s
{1, 3, 4}
>>> s1 = set(1,2,3)
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
s1 = set(1,2,3)
TypeError: set expected at most 1 arguments, got 3
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 - s2
{1}
>>> s2 - s1
{4}
>>> s1 | s2
{1, 2, 3, 4}
>>> s1 ^ s2
{1, 4}
>>>
**可變對象和不可變對象
Python在heap中分配的對象分成兩類:可變對象和不可變對象。所謂可變對象是指,對象的內容可變,而不可變對象是指對象內容不可變。
不可變(immutable):int、字符串(string)、float、(數值型number)、元組(tuple)
可變(mutable):字典型(dictionary)、列表型(list)
不可變類型特點:
看下面的例子(例1)
- i = 73
- 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 基礎概念