您好,登錄后才能下訂單哦!
一、類型
1.變量沒有類型,數據有類型
例:num = 1 ---->num是沒有類型的,1是int類型
二、格式化輸出
2.name = "張三"
age = 18
print("我是" + name + ",今年" + age + "歲") #這樣會報錯,用+進行拼接時,正數和字符串不能拼接
3.占位符
%c 字符
%s 字符串
%d 有符合的十進制整數
%u 無符號十進制整數
%o 八進制整數
%x 十六進制整數(小字母0x)
%X 十六進制整數(大寫字母0X)
%f 浮點數
%e 科學計數法(小寫'e')
%E 科學計數法(小寫'E')
%g %f和%e的簡寫
%G %f和%E的簡寫
三、運算符
1.
/ 除 得到結果是浮點數
//取整除 不是四舍五入 是取比結果小的第一個整數
%取余
**指數
2.復合運算符(在進行符合運算的時候,不論什么情況,都首先算等號右邊的式子)
+=
-=
*=
/=
**=
//=
3.常用數據類型轉換(input()輸入的是字符串)
int(x) 將x轉換成一個整數
float(x) 將x轉換成一個浮點數
complex(real,[,imag]) 創建一個復數,real為實部,imag為虛部
str(x) 將x轉換成一個字符串
repr(x) 將x轉換成表達式字符串
eval(str) 用來計算在字符串中的有效的python表達式,并返回一個對象
tuple(s) 將序列s轉換成一個元組
list(s) 將序列s轉換成一個列表
chr(x) 將一個整數轉換成一個Unicode字符
ord(x) 將一個字符轉成一個ASCII整數值
hex(x) 將一個整數轉成一個十六進制的字符串
4.切片
name = "abcdef"
print(name[0:3]) 取下標0-2的字符
print(name[0:5]) 取下標0-4的字符
print(name[3:5]) 取下標3-4的字符
print(name[2:]) 取下標2之后到最后的的字符
print(name[1:-1]) 取下標1開始到最后第二個的字符
5.字符串常見的操作
find(str,0,len(mystr)) 查找字符串中是否出現str字符,從下標為0開始到最后;沒有找到則打印-1
index(str,0,len(mystr)) 跟find()方法一樣,只不過如果str不在 mystr中會報一個異常.
count() 返回 str在start和end之間 在 mystr里面出現的次數
replace() 把 mystr 中的 str1 替換成 str2,如果 count 指定,則替換不超過 count 次.
nystr.solit(str,2) 以 str 為分隔符切片 mystr,2則表示 只分割幾個字符串
capitalize 把字符串第一個字符大寫
title 把字符串的每個單詞首字母大寫
startswith 檢查字符串是否以"str"開頭,是則返回True
endswith 檢查字符串是否以"str"結尾,是則返回True
lower 將字符中所有大寫轉換成小寫
upper 將字符中的所有小寫轉換成大寫
ljust 返回一個原字符串左對齊,并使用空格填充至剩下長度的新字符串
rjust 返回一個原字符串右對齊,并使用空格填充至剩下長度的新字符串
center 返回一個原字符串居中,并使用空格填充至長度 width 的新字符串
lstrip 刪除str左邊的空白字符
rstrip 刪除str左邊的空白字符
strip 刪除mystr字符串兩端的空白字符
rfind 從右查找與find差不多
rindex 類似于 index(),不過是從右邊開始.
partition 把mystr以str分割成三部分,str前,str和str后
rpartition 類似于 partition()函數,不過是從右邊開始.
splitlines 按照行分隔,返回一個包含各行作為元素的列表
isalpha 如果 mystr 所有字符都是字母 則返回 True,否則返回 False
isdigit 如果 mystr 只包含數字則返回 True 否則返回 False.
isalnum 如果 mystr 所有字符都是字母或數字則返回 True,否則返回 False
isspace 如果 mystr 中只包含空格,則返回 True,否則返回 False.
join mystr中每個字符串后面插入str構成一個新的字符串
6.列表的常見操作(列表是有序的,可以重復,可變)
添加操作:
list_1.append("asd") 直接添加到最后
list_1.extend([1,2]) 將另一個集合中的元素逐一添加到列表中
list_1,insert(index,obj) index表示添加到指定下標處,obj代表要添加的內容
改操作:
list_1[1] 根據對應的位置進行修改
查:
in(存在),如果存在那么結果為true,否則為false
not in(不存在),如果不存在那么結果為true,否則false
index和count與字符串中的用法相同 a.index('a',1,4)按照索引1到索引4查找a出現的位置(這個位置還是原理的索引)
刪除操作:
del:根據下標刪除
pop:刪除最后一個元素
remove:根據元素的值進行刪除
排序:sort reverse
sort是將list按照特定的順序進行排列參數reverse=True可改為倒序,由大到小,
reberse是將list逆置
7:元組(元組的元素是不能修改的)
index和count與字符串和列表中的用法相同
8:字典(無序可變)只有不可變的數據類型才能作為字典的鍵
若訪問不存在的鍵值時則會報錯,
在我們不確定字典中是否存在某個鍵而又想獲取其值時,可以使用get方法,還可以設置默認值
添加操作:
1.根據索引訪問不存在的元素會報錯
2.如果在使用 變量名['鍵'] = 數據 時,這個“鍵”在字典中,不存在,那么就會新增這個元素
demo:添加新的元素
刪除操作:
del
del info["name"]
clear() 清空整個字典,但是字典本身還存在
len(dic) 測量字典中,鍵值對的個數
dic.keys 返回一個包含字典所有KEY的列表
dic.values 返回一個包含字典所有value的列表
dic.items 返回一個包含所有(鍵,值)元祖的列表
dic.has_key dict.has_key(key)如果key在字典中,返回True,否則返回False
遍歷字典的元素
dict = {"name":"zhangsan","sex":"nan"}
for item in dict.items()
print item
>>('name','zhangsan')
>>('sex','nan')
遍歷所有鍵值對
dict = {"name":"zhangsan","sex":"nan"}
for k,v in dict.items()
print (k,v)
>>name,zhangsan
>>sex,nan
實現帶下標的索引遍歷
>>> chars = ['a', 'b', 'c', 'd']
>>> for i, chr in enumerate(chars):
... print i, chr
...
0 a
1 b
2 c
3 d
cmp?python中才有
cmp(item1, item2) 比較兩個值
關于引用:
使用1:不可變類型,修改形參,不影響實參
使用2:可變類型作為實參 修改則改變實參
使用3:可變類型作為實參時,在函數里為形參重新復制
結果:可變類型作為實參,如果為形參重新復制,修改形參不影響實參
關于Python的一些總結
希望自己以后在學習Python的過程中可以邊學習邊總結,就自己之前的學習先做以總結,之后將不斷總結更新。
為什么選擇Python
經常會有同學問我為什么選擇Python。我很喜歡這門語言,因為它的簡潔靈活,易學,易讀,可移植并且功能強大。
高級
可以說,每一代編程語言的產生,我們都會達到一個新的高度。從匯編語言,到C Pascal等,伴隨著C語言的誕生,產生了C++、Java這樣的現代編譯語言,之后有了強大的可以進行系統調用的解釋性腳本語言Python、 Perl...
比如Python中就有一些高級的數據結構,列表和字典就是內建于語言本身可以直接使用的,在核心語言中提供這些重要的構建單元,可以縮短開發時間和代碼量,產生可讀性更好的代碼。
面向對象
Python是面向對象編程
內存管理器
C 或者 C++最大的弊病在于內存管理是由開發者負責的。所以哪怕是對于一個很少訪問、修改和管理內存的應用程序,程序員也必須在執行了基本任務之外履行這些職責。這些加諸在開發者身上的沒有必要的負擔和責任常常會分散精力。
在 Python 中,由于內存管理是由 Python 解釋器負責的,所以開發人員就可以從內存事務中解放出來,全神貫注于最直接的目標,僅僅致力于開發計劃中首要的應用程序。這會使錯誤更少、程序更健壯、開發周期更短。
解釋性和編譯性
Python 是一種解釋型語言,這意味著開發過程中沒有了編譯這個環節。一般來說,由于不是以本地機器碼運行,純粹的解釋型語言通常比編譯型語言運行的慢。然而,類似于 Java,Python實際上是字節編譯的,其結果就是可以生成一種近似機器語言的中間形式。這不僅改善了 Python的性能,還同時使它保持了解釋型語言的優點。
Python為什么運行速度相較于C語言慢
因為Python等動態語言每一個簡單的操作都需要大量的指令才能完成。Python是動態語言,變量只是對象的引用,比如對于一個簡單的操作:a+b,在C語言中只需要一個機器指令ADD就好,而對于Python而言,變量a和b本身沒有類型,而它們的值有類型,所以在相加之前需要先判斷類型,之后,讀取數值,相加,生成一個新對象,將運算結果存入,返回對象,當然,可能還會考慮內存溢出等問題。
Python基礎
數據類型
python中的數據類型可以分為:字符串、布爾類型、整數、浮點數、數字、列表、元組、字典和日期。
字符串
不可變對象,可使用單引號,雙引號擴起來表示單行字符串,使用三引號表示多行字符串,在三引號可以自由的使用單引號和雙引號。
ASCII碼
字符串比較特殊的是編碼問題 我們知道,計算機是美國人發明的,最初只有127個字母被編碼到計算機中,包括大小寫字母、數字和一些符號,這個編碼表被稱為ASCII碼表。
Unicode
要處理一個中文顯然一個字節是不夠用的,又不能和ASCII碼沖突,因此中國制定了GB2312編碼。而全世界有很多的語言,在多語言混合的文本中,顯示出來的話一定會有亂碼,因此,Unicode應運而生,它將所有語言統一到一套編碼中,就不會有亂碼問題了。ASCII碼用一個字節表示了一個字符,而Unicode用兩個字節表示一個字符。以Unicode表示的字符串用u'...'表示。
UTF-8
經常在.py文件的開頭寫的"#coding:utf-8”是什么意思?我們知道Unicode編碼要比ASCII編碼多一倍的存儲空間,在存儲和傳輸上會十分的不劃算,如果寫的文本全是英文的話,使用Unicode編碼就十分浪費。于是UTF-8編碼出現了,UTF-8編碼是把一個Unicode字符根據不同的數字大小編碼成1-6個字節,并且可以將ASCII碼看成是UTF-8的一部分。
編碼解碼
在Python2.7中,操作系統給它什么編碼的字符串,它就接收啥格式的字符串,默認的格式與使用的格式不同,就會出現各種錯誤。
解決方法:
1.知道系統所使用的編碼格式
2.把獲取的頁面先用系統格式解碼,然后在編碼為utf8格式
3.你的腳本中統一使用uft8編碼
4.處理結束,把你的字符串先utf8解碼,然后系統格式編碼。
Python中,通常使用decode()和encode()進行解碼和編碼。
布爾類型
一個布爾值只有True和Flase兩種值
整數
包括整數和負整數。
浮點數
就是小數 整數和浮點數在計算機內部的存儲是不同的 整數的運算永遠是精確的 而浮點運算可能有四舍五入的誤差
列表List
list是一個是一個可變的有序表,是Python內置的一種數據類型,可以隨時添加、刪除、替換其中的元素。
Python中的列表就是一個迭代器,我們知道Python是使用C編寫的,那么list的內部實現是怎樣的呢?Python中的列表是基于PyListObject實現的,PyListObject是一個變長對象,在內部通過一些方法維護列表的地址,進行內存管理等實現列表的功能。
元組Tuple
除了元組以外的另一種有序表稱為元組tuple,但是tuple一旦初始化便不能修改,在定義時,tuple的元素就被確定了。為什么要引入tuple呢?因為tuple不可變,所以代碼更為安全,能用tuple代替list的情況就盡量使用tuple。
由于元組是不可變的,因此修改元素操作是非法的,但是可通過對元素進行連接組合,比如:tuple3 = tuple1 + tuple2。
使用del語句可刪除整個元組。
字典Dict
Python內置了字典,使用key-value存儲,具有極快的查找速度。和list相比,查找速度要高很多。
為什么dict查找速度這么快?因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往后翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。第二種方法是先在字典的索引表里(比如部首表)查這個字對應的頁碼,然后直接翻到該頁,找到這個字,無論找哪個字,這種查找速度都非常快,不會隨著字典大小的增加而變慢。
dict的初始化如下:
a = {}
a['A'] = 1
Dict和List的區別:Dict的查找速度和插入速度都是極快的,不會隨著key的增加而增加;但dict要占用大量的內存,內存浪費多。
Dict是不可變對象,因為使用key來計算value的存儲位置,為了保證結果的正確性,作為key的對象不能變,可使用字符串、整數等不可變的對象作為dict中的key。
結合Set
set和dict類似,也是一組key的集合,但是不同的是在set中沒有重復的key。
可變和不可變
綜上所述,Python中的不可變對象有:字符串、整數、元組;可變對象有:列表,集合,字典。
對于可變對象,比如list,對list進行操作,list內部的內容是會變化的,而對于不可變對象,比如str,使用replace()方法,雖然可以更改值,但是變量的值并不會發生改變,為什么呢?
比如:
#coding:utf-8 a = 'abc' b = a.replace('a','A') print b print a
a是變量,而'abc'才是字符串對象,為什么a的值在執行完上述代碼之后還是'abc',是因為a本身是一個變量,指向的對象是'abc',調用方法replace是作用在字符串對象'abc'上的,但并沒有改變'abc‘的內容,只是新創建了一個對象并賦值給b變量。
對于不可變對象,調用自身的任意方法,并不會改變對象自身的內容,這些方法會創建新的對象并返回,保證了不可變對象本身是永遠不可變的。
傳值還是傳引用
Python在參數傳遞時遇到的一個有趣的問題是:函數的傳參是傳值還是傳引用?
對于不可變對象作為函數參數,相當于C系語言的值傳遞;
對于可變對象作為函數參數,相當于C系語言的引用傳遞。
高級特性
迭代器
Python中的迭代器是什么呢?
迭代器是訪問集合元素的一種方式,迭代器的對象是從集合的第一個元素開始訪問,直到所有的元素訪問完結束,迭代器只能前進而不能后退。
對于遍歷支持隨機訪問的數據結構(tuple,list),迭代器相比于for循環并無優勢,因為迭代器丟失了索引值。但對于無法隨機訪問的數據結構,迭代器是唯一的訪問元素的方式。
迭代器不要求事先準備好整個迭代過程中的所有元素,迭代器僅在迭代到某個元素時才計算該元素,迭代器僅僅在迭代到某個元素時才計算該元素,在這之前或之后,元素可以不存在或者被銷毀,這個特點使得迭代器特別適合用于遍歷一些巨大的或是無限的集合。
迭代器中有兩個基本的方法:
next方法:返回迭代器的下一個元素
__iter__方法:返回迭代器對象本身。
生成器
帶有yield的函數在Python中被稱為生成器。yield就是將函數變成了一個生成器,函數執行過程中使用yield就好像是用yield將執行中斷多次,每次中斷都會通過yield返回當前的迭代值。
當數據量較大時,使用生成器的效率更高。
裝飾器
函數是一個對象,函數對象也可以被賦值給變量,所以,通過變量也能調用該函數。在代碼運行期間動態增加功能的方式,稱為裝飾器。使用Python的@語法,把裝飾器置于函數的定義處。
元類
類是用來描述如何生成一個對象的代碼段,在Python中,類同樣是一個對象,只要使用class關鍵字,Python解釋器在執行的時候就會創建一個對象。這個對象自身擁有創建對象的能力,所以它是一個類,但它本身還是一個對象,因此,可以實現以下操作:可以將它賦值給一個變量、可以拷貝它、可以為它增加屬性、可以將它作為函數參數進行傳遞。
這也是動態語言和靜態語言最大的不同,函數和類的定義,不是編譯時定義的,而是運行時動態創建的。也就是在Python中,可以動態的創建類,類也是對象,這就是使用關鍵字class時Python在幕后做的事情,這些都是通過元類實現的。
那么到底什么是元類呢?
元類就是用來創建類的東西,創建類就是為了創建類的實例對象,但是我們知道類就是對象,元類就是用來創建這些類(對象)的,所以元類就是類的類。
元類是創建類這種對象的東西,可以將元類稱為類工廠。
元類的主要用途是創建API。
閉包
Python中的閉包是什么?
如果在一個內部函數里,對在外部作用域的變量進行引用,那么內部函數就被認為是閉包。用Python的語言介紹就是,調用一個函數A,這個函數A返回了一個函數B給你,這個返回的函數B就叫做閉包。
裝飾器就是一個閉包。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。