Python基礎
環境搭建
Python的運行環境
- 從官網下載相應版本,下載
- 安裝anaconda,下載
- 使用docker
- 安裝pypy,官網
Python包管理
- 直接使用pip
- 使用conda
- 使用虛擬環境
- 使用景象加速(https://pypi.tuna.tsinghua.edu.cn/simple)
創建一個stenv目錄,然后進入到stenv目錄
創建虛擬環境
python3 -m venv .
激活虛擬環境
source bin/activate #windows中直接執行activate.bat
這虛擬環境就創建完成
退出虛擬環境
終端執行命令:deactivate
將Python運行起來
- 使用終端
- 直接作為腳本
- 在編譯器運行
- 打包為可執行程式 (pyinstaller -F source)
基礎語法
快速入門
'''
基本命名方式
module_name, 模塊
package_name, 包
ClassName, 類 駝峰
method_name, 方法
ExceptionName, 例外
function_name, 函式 下劃線
GLOBAL_VAR_NAME, 全域變數
instance_var_name, 實體
function_parameter_name, 引數
local_var_name. 本變數
'''
"""
關鍵字
and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield
"""
#基本變數
a = 3
b = 3.5
c = "hello"
d = ['1',123,3.5]
#條件判斷,使用4個空格縮進,不使用tab
if a == 3:
print("a is 3")
else:
print("a is not 3")
#回圈
for i in range(3):
print(i)
#函式
def add(a,b):
"""
實作兩個數相加
:param a: 加數
:param b: 被加數
:return: 回傳相加結果
"""
return a + b
#類
class StMath(object):
"""
實作數學計算的類
"""
def __init__(self,a_in):
"""
初始化方法
:param a_in: 初始化數值
"""
super().__init__()
self.a = a_in
def add(self,B):
"""
實作兩個math物件相加
:param B: 被加math物件
:return: 相加結果
"""
return StMath(self.a + B.b)
基本型別
數字型別
高精度!高精度!高精度!重要的事說三遍
字串
基本操作
#增刪改查
content = "abcxabcyabc"
print(content+"123")
print(content[:2]+content[4:])
print(content.replace("abc","python"))
print(re.sub("abc","python",content)) #使用正則運算式替換
print(content.find("xyz",2)) #或"xyz" in content
print(re.findall("abc",content))
編碼問題
python3中,文本總是Unicode,由str型別表示,二進制資料則由bytes型別表示,Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰,你不能拼接字串和位元組包,也無法在位元組包里搜索字串
一個亂碼問題演示
"你好".encode("utf-8").decode("gbk")
#str,bytes再一個事例
"你好".encode("unicode-escape").decode()
ord('你')
List
list具有范型特征(講完物件再回顧排序)
#增刪改查
a = [1,2,3,4,5,6,7]
#增加元素
a.append(8)
#洗掉元素
a.remove(3)
#查找元素
a.index(6)
#修改元素
a[4] = 10
#切片操作,會忽略結束元素
a[2:5] #注意不會包括索引5的元素
a[::-1] #反序操作
#便利操作
for v in a:
print(v)
#如果屬性要索引
for i,v in enumerate(a):
print(i,v)
字典
#增刪改查
stu_dict = {"name":"jack","age":21,"socre":100}
#增加
stu_dict["phone"] = "18000000000"
#洗掉
del stu_dict["phone"]
#修改
stu_dict["name"] = "lucy" #stu_dict.update({})
#查詢
stu_dict.get("name") #和stu_dict["name"]區別
使用函式
函式是python的一等公民,變為:
- 運行時創建
- 能賦值
- 能傳參
- 能回傳
函式的引數
不可變物件
str,int,number都是不可變物件,采用值傳遞
a = 20
def change_value(x):
x = 100
change_value(a)
print(a) #結果仍然是20
可變物件
list,dict是可變物件,采用參考傳遞
def change_list(x):
x.append(20)
y = [1,2,3]
change_list(y)
print(y) # 結果是1,2,3,20
定位引數和關鍵字引數
定位引數必須按照次序,關鍵字引數可以任意打亂次序,可以賦默認值
def extract_content(tag_name,start_pos = 20)
print("tag_name is ::::::",tag_name)
*args, **karges
使用args和kargs傳入不定長引數,args捕獲的定位引數被組織為元組,kargs捕獲的引數被組織為字典
def extract_content(*args,**kargs):
print(args)
print(kargs)
extract_content("a",3.5,[1,2,3],name="jack",age="22")
陣列加上*號傳入會被args解包后逐個捕獲
list_args = [1,2,3,4,5,6]
extract_content(*list_args)
函式的注解
可以給引數和回傳值附加元資料,對于復雜資料支持的時候可以提高易讀性,提升開發效率,Python自身不做檢查不做校驗,不會對程式的行為產生影響,僅僅是一種約定
def add(add_a:int,add_b:int) -> int:
return add_a + add_b
print(add(10,20))
變數的作用閾
全域作用域與區域作用域
#下面的代碼錯在什么地方?使用global糾正
m = 10
def show_diff():
print("********show_diff*********")
global
n = 20
print(m)
m = 90
print(n)
函式和閉包
#函式和閉包
def create_sum():
sum = 0
def sum_all(a_in):
nonlocal sum
sum += a_in
return sum
return sum_all
s_custom = create_sum()
#本質是什么
#print(s_custom.__closure__[0].cell_contents)
print(s_custom(10))
print(s_custom(20))
print(s_custom(30))
如何做為一等公民?
可以賦值
p = add
print(p(10,20))
可以作為引數傳遞(linux,spring設計)
def download_url(url_str,extract_rule):
print("下載了某個網頁")
result = "<html><head><a href='//www.baidu.com'></a></head></html>"
urls = extract_rule(result)
print("頁面的所有地址是:",urls)
def normal_url_rule(result):
return re.findall("<a\s+href=\'(.*?)\'",result)
def no_http_url_rule(result):
origin_url = re.findall("<a\s+href=\'(.*?)\'",result)
return ["http:"+ url for url in origin_url]
download_url("",no_http_url_rule)
做為回傳值
def math_rule():
def rule(a,b):
return a+b
return rule
rule = math_rule()
print(rule(20,30))
裝飾器
裝飾器的本質,函式的嵌套呼叫
import time
#裝飾器
def download_html():
time.sleep(1)
print("執行了下載操作")
def record_time(download_func):
def record_wrapper():
start_time = time.time()
download_func()
end_time = time.time()
print("下載經過了時間",end_time - start_time)
return record_wrapper
decorate_download = record_time(download_html)
decorate_download()
使用語法糖,更直觀的使用體驗:
@record_time
def download_html():
time.sleep(1)
print("執行了下載操作")
download_html()
裝飾器中傳遞引數:
def record_time(level):
def decorate(download_func):
def record_wrapper(*args,**kargs):
print("下載網址是:",args)
print("日志等級是",level)
start_time = time.time()
download_func()
end_time = time.time()
print("下載經過了時間",end_time - start_time)
return record_wrapper
return decorate
@record_time(level=9)
def download_html():
time.sleep(1)
print("執行了下載操作")
面向物件
面向物件的基本特點,封裝、繼承、多型,抽象用來設計類的層次結構
面向物件基礎
self,方法重寫,@classmethod @staticmethod,內置方法重寫
class Person(object):
"""
定義抽象基類
"""
def __init__(self,score):
self.score = score
self.__name = "jack" #加上兩個下劃線,表示私有方法
@classmethod
def from_file(cls,file_name):
"""
從檔案讀取學生成績
:param file_name: 檔案名
:return:
"""
score = open("score.txt").read()
return cls(score)
@staticmethod
def extract_address():
return "no.90"
def run(self):
print("person run!!!!")
def __add__(self, other):
return Student(self.score + other.score)
class Student(Person):
"""
學生資訊類
"""
def __init__(self,score):
super().__init__(score)
def ask(self):
print("ask a question!!")
def run(self):
super().run()
print("student run!!",self.score)
# p = Person(85)
# p.run()
s = Student.from_file("test.txt")
print(Student.extract_address())
s.run()
抽象層構建
抽象基類中的抽象方法必須在子類中實作,否則子類無法實體化,
#抽象介面
from abc import ABC,abstractmethod
class Person(ABC):
"""
定義抽象基類
"""
def __init__(self):
pass
@abstractmethod
def run(self):
pass
class Student(Person):
def __init__(self):
super().__init__()
def ask(self):
print("ask a question!!")
def run(self):
print("run run run1!!")
動態特性
運行程序中動態判斷屬性,設定屬性,可以結合組態檔靈活實作類的加載,修改
- hasattr
- setattr
- hasattr
package = __import__('st_python_base')
student_class = getattr(package,'Student')
s = student_class(90)
s.run()
當出現未知訪問屬性的時候,進行處理
def __getattr__(self, item):
print('getattr')
記憶體管理
關于參考計數
import weakref
def over():
print("student is over!!!")
x = st_python_base.Student(10)
ender = weakref.finalize(x,over)
y = x
關于深復制和淺復制
注意直接賦值,copy,deepcopy的區別?
from copy import copy
from copy import deepcopy
class Student(object):
def __init__(self):
self.course = [1,2,3,4,5]
self.name = "jack"
s1 = Student()
s2 = deepcopy(s1)
s1.course.append(12)
print(s2.course)
背景關系管理
with…as…的本質
class StTools(object):
def __enter__(self):
print("進入背景關系塊,,,,")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("從背景關系塊退出")
def make_sign(self):
print("test!!!")
with StTools() as st:
st.make_sign()
關于迭代器和生成器
理解yield和send
def s():
print('begin test')
a = yield 10
print(a)
b = yield 20
print('end test!')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/80508.html
標籤:其他
上一篇:吳恩達(Andrew Ng)deep learning課程-Sequence Models編程作業Emojify Pycharm實作
