1.概述
Python是著名的“龜叔”Guido van Rossum在1989年聖誕節期間編寫的。
Python為我們提供了非常完善的基礎代碼庫,覆蓋了網絡、文件、GUI、數據庫、文本等大量內容,被形象地稱作“內置電池”。用Python開發,許多功能不必從零編寫,直接使用現成的即可。
龜叔給Python的定位是”優雅“、”明確“、”簡單“,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常復雜的程序。
2.Python應用
a.網站後台開發-PythonWeb
b.日常小工具 運維腳本
c.將其他語言開發的程序包封裝起來 方便調用-膠水語言
d.爬蟲開發-python爬蟲
e.科學計算AI領域有獨特優勢-python是人工智能語言
3.Python
優點:
簡單易學
完善的語言特性
天然開源
豐富的社區支持
缺點:
慢
python是一種解釋型的語言,編寫的代碼就是執行碼,在python程序執行時,由python的解釋器,邊讀取邊解釋,邊執行,效率比較低。
所以在開發高性能程序時,基本不會考慮python。但是在普通的不追求極致效率的應用的程序時,python慢的缺點體現的並不明顯,而python簡單 高效的開發能力優勢明顯,所以被大量的使用
代碼無法加密
由於python是一種解釋型的語言,編寫的代碼就是執行碼,因此將python程序發布的過程就是將源代碼發布的過程,代碼無法實現保密的效果,但是正是這樣的特點決定了python從語言層面上就是天然開源的,這也是python社區快速發展的原因之一。
1.Python安裝配置
方位python官方網站,下載python安裝包
https://www.python.org/downloads/
python目前分為兩大版本,互不兼容
2.x.x
3.x.x
雙擊安裝
python-2.7.13.amd64.msi
設置環境變量
將python安裝位置配置到PATH環境變量下。
2.Python的使用方式
a.shell命令方式
在命令行下以交互執行命令
在cmd命令下通過python命令進入python命令行,交互式編寫代碼處理數據
b.將python卸載文件中
可以將代碼寫在.py文件中,再通過python命令執行文件
c.使用IDE工具開發python
①pycharm
官方推薦的python開發工具
②eclipse安裝python開發插件
使elipse具有開發python的能力
1.語法細節
a.編碼
python2解析器python文件默認采用iso8859-1。python3模式使用utf-8
如果python文件本身的編碼和以上編碼不一致會出現亂碼問題
此時可以在文件中通過如下注釋通知解釋器解析當前文件時采用的編碼,兩碼一致可以解決
亂碼:
b.造句
python通常一行為一條語句,不需要分號標識
如果將多條語句寫在一行內,則需要使用分號分割防止產生歧義
c.縮進
python中沒有使用大括號作為作用域的標識,而是采用制表符來標識作用范圍
d.注釋
python使用#作為單行注釋 使用三個單引號 或 三個雙引號作為多行注釋
e.引用及常量變量
python沒有聲明引用的關鍵字,直接寫引用的名稱就是在聲明一個引用。
python的引用沒有數據類型的區分,也即一個引用可以先後被指向不同類型的數據。
python中小寫的引用標識變量 大寫的引用表示一個常量,要注意的時,此處常量只是一種約定,要求未來使用者不要進行修改,但本質上還是變量,如果真的修改也是可以修改成功的。
2.標識符
在python中,所有標識符可以包括英文、數字以及下劃線(_),但不能以數字開頭。
python中的標識符時區分大小寫的。
在python中下劃線_是有特殊意義的
1)以單下劃線開頭_foo的代表不能直接訪問類屬性,需要通過類提供的接口進行訪問,不能用from xxx import *訪問:
2)以雙下滑線開頭的__foo代表類的私有成員
3)以雙下劃線開頭和結尾的__foo__代表python裡特殊方法專用的標識,如__init__()代表類的構造方法
3.數據類型
python中的引用時沒有數據類型的,但是數據本身是有類型的區別的
a.字符串
可以用單引號,雙引號或三引號來聲明一個字符串直接量
其中單引號和雙引號沒什麼差別
而三引號聲明的字符串可以包含任意字符,這些字符會被直接當作字符串的內容 從而省去轉義的過程
python中也可以使用r或R在字符串直接量前進行修飾,表面當前字符串忽略轉義直接使用原值
python字符串提供了大量的操作方法:
b.布爾
布爾類型的直接量只有兩個值
True False
c.數值
python中代表數據的類型,可以有如下四種直接量的值:
整型
通常被稱為是整型或整數,是正或負整數,不帶小數點。
長整型
無限大小的整數,整數最後一個大寫或小寫的L。
浮點型
浮點型由整數部分與小數部分組成,浮點型也可以使用科學計數法表示(2.5e2=2.5 x 10^2=250)
復數
復數由實數和虛數部分構成,可以用a+bj,或者complex(a,b)表示,負數的實部a和虛部b都是浮點型。
數值類型提供了大量的操作方法:
d.空值
類似於java中的null,表示沒有值,只有一個直接量
None
x=Node(JAVA:Object = null)
a.算數運算符
b.比較(關系)運算符
c.賦值運算符
d.位運算符
e.邏輯運算符
f.成員運算符
g.身份運算符
h.運算符的優先級
a.條件語句
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QuuaFPRe-1654440257030)( https://img-blog.csdnimg.cn/c72654b42d9f4c709984806cefad4c21.png)]
b.循環語句while
c.循環語句for
補充:
1.列表-list
可以用來存儲 內容可變 長度可變 類型可以不同 有序的數據的數據結構
類似於java的List
列表的基本使用:
列表的其他函數:
2.元組 - tuple
元組的列表:
①元組本身是不可變數據類型,沒有增刪改查
②元組內可以存儲任意數據類型
元組的基本使用:
元組的其他函數
3.Set - 涉及集
不可修改 不可重復 無序 類型可以不同 的列表
類似於java中的Set
set的基本用法:
4.字典 - dict
存儲鍵值對類型的數據 鍵不可重復 無序
類似於java的Map
dict的基本用法:
dict的其他方法:
1.定義函數
a.普通函數定義
通過def關鍵字定義函數,之後跟函數名稱和小括號包裹的參數列表,之後跟一個冒號,在其後編寫函數體。
函數體的第一行內容,可以直接是一個字符串,此字符串不影響函數體的內容,相當於是該方法的文檔說明,用來描述函數的功能,可以在後續查看。
函數內容需要縮進。
通過return關鍵字在函數內部返回,並可以選擇性返回一個返回值,如果return後沒有明確的返回值,則默認返回的是一個None。
##定義函數
def sumx(n1,n2):
"兩數求和函數"
return n1+n2
b.函數直接量定義函數
通過lambda表達式來聲明一個函數,lambda關鍵字之後跟參數列表,再跟冒號,之後是函數的體,這種方式聲明的函數體只能是一個表達式,如果函數體有多條語句,則無法通過此方式定義。
##函數直接量定義函數
sumx = lambda arg1,arg2:arg1+arg2
print(sumx(2,3))
2.函數的調用
通過函數名之後跟小括號傳入參數值就可以用調用函數了
函數的調用過程中,也可以在實參列表中明確的指定實參要賦值給哪一個形參,從而實參列表的順序可以和形參列表不同
##函數的調用
def sumx3(n1,n2,n3):
return n1+n2+n3;
print sumx3(1,2,3)
print sumx3(n3=3,n2=2,n1=1)
3.缺省參數
在定義函數的過程中,可以為全部或部分函數參數指定默認值,則在調用函數的過程中可以選擇性的不傳入這些參數,則這些參數采用默認值執行函數。
##缺省參數
def sumx4(n1,n2=10):
return n1 + n2;
print sumx4(2,3)
print sumx4(2)
4.不定長參數
類似於java中的可變參數,python中的函數也可以具有不定長的參數,未來再調用時可以傳入0個或多個參數,而在函數的內部可以按照使用數組的方式使用該不定長參數。
可以通過在形參名稱之前加*號,將參數設定為不定長參數。
一個函數中,不定長參數最多只能有一個,且必須出現在函數參數列表的最後一位。
##不定長參數
def sumx5(*ns):
s = 0;
for x in ns:
s += x;
return s;
print sumx5(2,3)
print sumx5(2,3,4)
print sumx5(2,3,4,5)
5.函數是一等公民
在python中函數的一等公民,具有完整的能力,屬性能做的函數都可以做。
a.賦值給引用
##函數是一等公民
def sumx6(n1,n2):
return n1 +n2;
print sumx6(2,3)
sumx7 = sumx6
print sumx7(2,3)
sumx6 = None
sumx7 = None
b.作為類的成員
class Person:
name = "zs";
age = 18;
def eat(self):
print "吃.."
def say(self):
print "說.."
c.作為局部成員
def eat(food):
def cook(food):
return "弄熟"+food;
print "吃"+cook(food)
eat("羊肉串")
d.高階函數作為方法的參數
def eatx(food,cookFunc):
food2 = cookFunc(food)
print "吃"+food2
def cookYRC(food):
return "烤盤"+food;
eatx("羊肉串",cookYRC)
eatx("涮羊肉",lambda food:"煮熟"+food)
e.高階函數作為方法返回值
def lookupCP(cai):
if "羊肉串" == cai:
def cookYRC(food):
return "烤熟"+food;
return cookYRC;
elif "涮羊肉" == cai:
return lambda food:"煮熟"+food;
else:
return lambda food:"弄熟"+food;
cookFunc = lookupCP("羊肉串")
print cookFunc("羊肉串")
cookFunc = lookupCP("涮羊肉")
print cookFunc("羊肉串")
1.模塊的概念
Python模塊(Module),是一個Python文件.以.py結尾,其中包含了Python對象定義和Python語句等內容。
簡單來說,一個Python文件就是一個python模塊。
Python是以模塊為單位來有結構的組織項目的。
把相關的代碼分配到一個模塊裡能讓你的代碼更好用,更易懂。
模塊能定義函數,類和變量,模塊裡也能包含可執行的代碼。
2.引入模塊
在某一個模塊中如果用到了其他模塊中定義的內容,就需要在當前模塊中引入該模塊。這個過程類似於java中的導包的過程,在Python中稱之為引入模塊。
a.引入模塊方式1:
#import module[module2[...moduleN]
import math;
print math.floor(3.14)
import Demo01;
print Demo01.sumx(2,3)
b.引入模塊方式2:
#from modname import name1[name2[...nameN]]
from math import *
print floor(3.14)
from Demo01 import sumx;
print sumx(2,3)
搜索路徑:
當你導入一個模塊,Python解析器對模塊位置的搜索順序是:
1)當前目錄
2)如果不在當前目錄,Python則搜索在shell變量PYTHONPATH下的每個目錄。
3)如果都找不到,Python會查看默認路徑。UNIX下,默認路徑一為/usr/local/lib/python/。Windows下通常c:\…\system32目錄下
3.包
包是一個分層次的文件目錄結構,用來組織程序結構。(作用和java一樣)
簡單來說包就是文件夾。
但是在python中並不是所有的文件夾都是包,一個文件夾下必須有一個名為__init__.py文件才會被識別稱為包。
__init __.py文件一方面是一個標識,標識當前文件夾是一個包,另一方面,這個文件中代碼還會再python包再第一次被使用被執行。
1.打印
print("abc")
2.鍵盤讀取
a.raw_input函數讀取鍵盤
這種方式的讀取,會將輸入當作一個字符串返回
str=raw_input(“請輸入:”);
b.input函數讀取鍵盤
這種方式的讀取,會將輸入當作一個表達式執行,返回的是表達式執行後的結果
str = input("請輸入: ")
3.讀寫文件
open函數操作文件:
file對象的屬性
4.系統操作
2.捕獲異常
當有異常拋出時,可以使用如下方法捕獲異常:
3.手動拋出異常
通過raise關鍵字,可以手動拋出異常
raise [Exception[,args[,traceback]]]
4.自定義異常
可以寫一個類繼承Exception來開發一個自定義異常
1.創建類
使用class關鍵字來創建一個類,class之後為類的名稱並以冒號結尾,後跟類體。
在類體的第一行可以寫一個字符串,作為該類的文檔聲明,這個文檔聲明可以通過ClassName.__doc__查看:
類的體中可以包含成員屬性 成員方法 構造方法等內容
class Person:
"代表人的類"
name = ""
age = "bj"
def __init__(self,name,age):#self相當於java的this
self.name = name;
self.age = age;
def eat(self):
print(self.name + "吃。。。。")
def say(self):
print(self.name+ "說。。。")
print Person.__doc__
p = Person("zs",18)
print p.name
print p.age
p.eat()
p.say()
2.創建屬性
python類中可以包含成員屬性。當創建該類的對象時,對象都會默認具有該屬性。
3.成員方法
python類中的方法和其他方法不同之處在於,方法中必須存在一個叫self的參數,這個self代表的當前對象的本身,相當於java中的this
4.構造方法
python中的類可以指定構造方法。在python類中定義為__init__的方法,就是python的構造方法。
5.創建對象
python中沒有new關鍵字,直接使用類名就可以創建出對象
6.增加刪除對象的屬性和方法
在python中,類的和對象關系並不是一種強關聯,類僅僅時創建對象的模板,一旦對象創出來,對象就是一個獨立的個體,可以自己增加或刪除屬性和方法。
注意,刪除操作只能刪除後天增加的屬性和方法,對於類中的屬性和方法無法刪除
另外,可以在對象創建出來後增加刪除屬性方法,意味著哪怕是同一個類創建的對象,也可以非常的不同。
p1 = Person("ls",20)
#增加屬性
p1.addr = "bj"
#增加方法
p1.sumx = lambda n1,n2:n1+n2;
print p1.addr
print p1.sumx(2,3)
#刪除屬性
del p1.addr
#刪除方法
del p1.sumx
7.類的內置屬性
python的類自動包含若干內置屬性,這些內置屬性往往具有特定功能
#__dict__:類的屬性(包含一個字典,由類的數據屬性組成)
#__doc__類的文檔字符串
#__name__類名或模塊名
#__module__:類定義所在的模塊
#__bases__:類的所有父類構成元素(包含了一個由所有父類組成的元組)
print Person.__doc__
print Person.__dict__
print Person.__module__
print Person.__name__
案例:
如果當前模塊是程序的入口,則模塊名會被改為__main__,如果不是則模塊名等於文件名。
因此,通常在模塊中會寫這樣的代碼,從而讓模塊被直接執行和被import導入是執行不同邏輯
if __name__=='__main__':
當模塊被直接執行時走的邏輯
else:
當模塊被import導入時執行的邏輯
8.類的封裝-訪問權限控制
python中類的屬性和方法都可以直接進行訪問權限的控制,控制的方法為:
①屬性或方法名稱如果以單下劃線開頭,則表示屬性或方法是保護成員,只能在類內部或子類內部訪問,但是這僅僅是一種約定,在語法層面並沒有這種限制。
②屬性或方法名稱如果以雙下劃線開頭,則是私有成員,只能在類的內部訪問,外界無法使用,這是python語法的一部分。
class Person :
"代表人的類"
__name = "zs"
def __say(self):
print("說。。。")
p = Person
print(p.__name)#屬性私有化,訪問不了,訪問報錯
p.__say()#方法私有化,訪問不了,訪問報錯
9.類的繼承
python類支持繼承。python支持多繼承。
繼承的語法:
class subClass(superClass,[...]):
類體
子類在構造時並不會自動調用父類的構造方法,如果需要,則應在子類的構造方法中顯式的調用父類構造。
在子類中調用父方法時,需要通過父類名來調用。
如果多重繼承中,多個父類有同名方法,則具體繼承到哪一個取決於父類的繼承順序,繼承聲明中越靠前優先級越高。
在子類中如果不喜歡父類的方法,可以進行重寫操作,在子類中聲明和父類名稱和參數相同的方法,自己來實現。
class Person :
"代表人的類"
name = ""
age = 20
def __init__(self,name,age):#self相當於java的this
self.name = name;
self.age = age;
def eat(self):
print(self.name + "吃。。。。")
def say(self):
print(self.name+ "說。。。")
class Coder:
def code(self):
print("寫代碼..")
def run(self):
print("加油,飙車..")
class Driver:
def driver(self):
print("開車..")
class Teacher(Person,Coder,Driver):
def teach(self):
print self.name + "教.."
t = Teacher("ww",33)
t.teach()
t.driver()
t.code()
t.run()
10.類的多態
python中引用沒有類型,引用可以先後等於完全不同類型的數據,自然也就沒有多態的概念了。
11.基礎方法重寫
python中的類中自帶了很多基礎方法,這些方法提供了類的特定的功能,可以通過重寫這些方法來覆蓋這些特定功能的實現。
__init__(self[,args...]): (相當於java的構造方法)
構造方法
__del__(self)
析構方法,刪除一個對象後要做的事
__str__(self)
用於將值轉化為適於人閱讀的形式(相當於java中的toString方法)
__cmp__(self,x)
兩個對象比較(相當於java的compareTo方法)