Python筆記二
- Python的特點和優點
- 淺拷貝與深拷貝的區別
- 列表與元組的區別
- 解釋python中的三元表達式
- python中如何實現多線程
- 什麼叫繼承
- 什麼是Flask?
- 如何在Python中管理內存
- help和dir函數
- 退出python時是否釋放所有內存分配
- 什麼是猴子補丁
- python字典
- 解釋*args和**kwargs
- 編程實現計算文件中的大寫字母數
- 什麼是負索引
- 如何隨機打亂列表中元素,要求不引用額外的內存空間
- join()和split()
- python是否區分大小寫
- python標識符命名規則
- 如何刪除字符串中的前置空格
- 如何將字符串轉爲小寫
- pass語句的作用
- 什麼是閉包
- python中有多少種運算符,分別解釋
- python中如何使用多進制數字
- 如何獲取字典中所有鍵
- 標識符爲什麼不建議使用下劃線開頭
- 如何生聲明多個變量並賦值
- 什麼是元組的解封裝
Python的特點和優點
- 解釋性:逐行進行解釋(執行),使得測試和調試變得簡單
- 動態性
- 面向對象
- 語法簡潔
- 開源
- GUI編程
- 便攜式:可以在window、mac、linux或其他任何平臺上運行
- 豐富的社區資源
淺拷貝與深拷貝的區別
- 淺拷貝:將對象的引用複製給另一個對象,意味着如果對對象的副本進行更改則會影響原對象
- 深拷貝:是將對象本身複製給另一個對象,意味着如果對對象的副本進行更改則不會影響原對象
列表與元組的區別
- 列表可變,元組不可變
>>> list = [1, 2, 3]
>>> list[1] = 5
>>> list
[1, 5, 3]
>>> tuple = (1, 2, 3)
>>> tuple(1) = 5
File "<stdin>", line 1
SyntaxError: can't assign to function call
解釋python中的三元表達式
- 與C++不同,python中不使用?符號,而是使用如下語法:
# 如果[expression]爲真,則執行[on true],如果爲假則執行[on false]
[on true] if [expression] else [on false]
- 例:
>>> a, b = 2, 3
>>> min = a if a<b else b
>>> min
2
python中如何實現多線程
- 線程是輕量級的進程,多線程允許一次執行多個線程。python是一個多線程語言,它有一個多線程包
- GIL(Global Interpreter Lock全局解釋器鎖)確保一次執行單個線程。一個線程保存GIL並將其傳遞給下一個線程之前執行一些操作,就會產生並行執行的錯覺,但實際上只是線程輪流在CPU上
什麼叫繼承
- 一個類繼承自另一個類,也可以說是一個孩子類/派生類/子類,繼承自父類/基類/超類,同時獲取所有的類成員(屬性和方法)
- 繼承可以使我們可以重用代碼,還可以更方便地創建和維護代碼
- python支持的繼承類型:
- 單繼承:一個子類繼承自單個基類
- 多重繼承:一個子類繼承自多個基類
- 多級繼承:一個子類繼承自一個基類,而基類繼承自另一個基類
- 分層繼承:多個子類繼承自同一個基類
- 混合繼承:兩種或兩種以上繼承類型的組合
什麼是Flask?
- 它是一個使用Python編寫的輕量級Web應用框架,使用BSD(自由軟件中使用最廣泛的許可協議之一)授權
- 其WSGI工具箱採用Werkzeug,模板引擎使用Jinja2,除了Werkzeug和Jinja2以外,幾乎不依賴任何外部庫,因爲Flask被稱爲輕量級框架
- Flask的會話使用簽名cookie來允許用戶查看和修改會話內容,它會記錄從一個請求到另一個請求的信息。如果要修改會話,則必須要有密鑰Flask.secret_key
如何在Python中管理內存
- python用一個私有堆內存空間來放置所有對象和數據結構,我們無法訪問,由解釋器來管理它
- 但如果使用一些核心API,我們就可以訪問一些Python內存管理工具控制內存分配
help和dir函數
- help():返回幫助文檔和參數說明
- dir():返回對象中所有成員(任何類型)
>>> import copy
>>> help(copy)
Help on module copy:
NAME
copy - Generic (shallow and deep) copying operations.
DESCRIPTION
Interface summary:
import copy
x = copy.copy(y) # make a shallow copy of y
x = copy.deepcopy(y) # make a deep copy of y
For module specific errors, copy.Error is raised.
.................
>>> dir(copy.copy)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
退出python時是否釋放所有內存分配
- 不會
- 那些具有對象循環引用或者全局命名空間引用的變量,在python退出時不會被釋放
- 也不會釋放C庫保留的部分內容
什麼是猴子補丁
- 在運行時動態修改已有的代碼(類和模塊),不需要修改原始的代碼
>>> class A:
>>> def func(self):
>>> print('Hi')
>>>def monkey(self):
>>> print("Hi, monkey")
>>> m.A.func = monkey
>>> a = m.A()
>>> a.func()
Hi, monkey
python字典
- 一種可變容器模型,可存儲任意類型對象
- 字典的每個鍵值對用冒號:分割,每個鍵值對之間用逗號,分割,整個字典在花括號{}中
- 鍵一般是唯一的,如果重複,最後的一個鍵值對會替換前面的,值不需要唯一
>>> dict = {'a':1, 'b':2, 'b':3}
>>> dict['b']
3
- 值可以取任何數據類型,但鍵必須是不可變的,如:字符串、數字、元組
解釋*args和**kwargs
- 當我們不知道將多少個參數傳遞給函數,比如:傳遞一個列表或一個元組值時,就可以使用*args
def func(*args):
for i in args:
print(i)
func(3, 2, 2)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3
2
2
- 當我們不知道將會傳入多少個關鍵字參數時,使用**kwargs會收集關鍵字參數
def func(**kwargs):
for i in kwargs:
print(i, kwargs[i])
func(a = 1, b = 2, c = 7)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a 1
b 2
c 7
編程實現計算文件中的大寫字母數
import os
os.chdir('C:/Users/Life/Desktop')
with open ('Today.txt') as today:
count = 0
for i in today.resd():
if i.isupper():
count += 1
print(count)
什麼是負索引
- 與正索引相反,夫索引是從右邊往左開始檢索
>>> list = [0, 1, 2, 3, 4, 5]
>>> list[-2]
4
>>> list[-5 : -2]
[1, 2, 3]
如何隨機打亂列表中元素,要求不引用額外的內存空間
- 使用shuffle函數
>>> from random import shuffle
>>> list = [1, 2, 3, 4, 5]
>>> shuffle(list)
>>> list
[4, 1, 5, 3, 2]
join()和split()
- join():可以將指定字符添加到字符串中
>>> ':'.join('1, 2, 3, 4')
'1:,: :2:,: :3:,: :4'
- split():可以用指定的字符分割字符串
>>> '1,2,3,4'.split(',')
['1', '2', '3', '4']
python是否區分大小寫
區分
>>> YQ = yq
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'yq' is not defined
python標識符命名規則
- 字符串可以時任意長度
- 只能以下劃線、大小寫字母開頭(A-Z/a-z)
- 其餘部分只能使用A-Z/a-z
- 標識符區分大小寫
- 關鍵字不能作爲標識符(關鍵字如下)
如何刪除字符串中的前置空格
- 使用lstrip去除前置空格
>>> ' YQ'.lstrip()
'YQ'
- 使用rstrip去除前置空格
>>> ' YQ '.rstrip()
' YQ'
如何將字符串轉爲小寫
- 使用lower()
>>> 'YQ'.lower()
'yq'
- 轉爲大寫使用upper()
>>> 'yq'.upper()
'YQ'
- 檢查字符串是否爲全大寫或全小寫,使用isupper()和islower()
- 像@和$這樣的字符既滿足大寫也滿足小寫
>>> 'YQ'.isupper()
True
>>> 'YQ'.islower()
False
>>> '@YQ'.isupper()
True
>>> '@yq'.islower()
True
>>> '$YQ'.isupper()
True
>>> '$yq'.islower()
True
- istitle()可以檢索字符串是否是標題格式
pass語句的作用
- 寫代碼時可能只寫了函數聲明還沒有想好函數怎麼寫,但爲了保證語法檢查正確必須輸入一些東西,此時使用pass
>>> def func(*args):
... pass
- 類似的break語句可以跳出循環
for i in range(6):
if i == 5 : break
print(i)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
- continue語句可以跳到下一輪循環
for i in range(6):
if i == 5 : continue
print(i)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
什麼是閉包
- 作用域:程序運行時變量可被訪問的範圍,定義在函數內的變量時局部變量,局部變量的作用範圍只能只能是函數內部範圍內,不能再函數外引用
def foo():
a = 10 #a爲局部變量
print(a) #NameError: name 'a' is not defined
a = 10 #a爲全局變量,,全局範圍內可見,在函數裏面也可以讀取
def foo():
print(a) #10
- 嵌套函數:不僅可以定義在模塊最外層,還可以定義在另一個函數內部,定義在函數裏面的函數稱爲嵌套函數,可以訪問到外層作用域中聲明的非局部變量
def print_msg(): #外圍函數
msg = 'I am YQ'
def printer(): #嵌套函數
print(msg)
printer()
print_msg()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am YQ
- 閉包:如果在一個內部函數裏,對外部作用域(但不是在全局作用域)的變量進行引用,那麼內部函數就是一個閉包。
- 它脫離了函數本身的作用範圍,依舊能夠對局部變量進行訪問
- 閉包避免了使用全局變量
def print_msg():
msg = 'I am YQ'
def printer():
print(msg)
return printer #此時的printer作爲返回值返回了
another = print_msg() #這裏的another就作爲閉包,他是的局部變量msg在函數外被訪問
another()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I am YQ
python中有多少種運算符,分別解釋
參考
7種運算符:算術、關係(比較)、賦值、邏輯、位、成員、身份運算符
- 算數運算符:+ - * / // ** %
- +:加法
- -:減法
- *:乘法
- /:除法
- //:地板除法,向下取整
- **:取冪
- %:返回除法後的餘數
>>> 7//2
3
>>> 2**3
8
>>> 13%2
1
- 關係運算符:用來比較兩個對象
- 賦值運算符
- =:簡單的賦值
- +=:加法賦值
- -+:減法賦值
- *=:乘法賦值
- /=:除法賦值
- %=:取模賦值
- **=:冪賦值
- //=:取整除賦值
- 位運算符:按位運算符是把數字當作二進制來計算的
- $:按位與,參與運算的兩個值,若相應位都爲1,則該位爲1
- | :按位或,只要對應的兩個二進位有一個爲1,結果爲1
- ^:按位異或,兩對應二進位相異結果爲1
- ~:按位取反,1變爲0,0變爲1
- <<:左移,符號右邊數字指定移動若干位,高位丟棄,低位補零
-
:右移,符號右邊數字指定移動若干位
>>> a = 60 # 60 = 0011 1100
>>> b = 13 # 13 = 0000 1101
>>> a & b
12 # 12 = 0000 1100
>>> a | b
61 # 61 = 0011 1101
>>> a ^ b
49 # 49 = 0011 0001
>>> ~ a
-61 # -61 = 1100 0011
>>> a << 2
240 # 240 = 1111 0000
>>> a >> 2
15 # 15 = 0000 1111
- 邏輯運算符(x, y)
- and,x爲False返回false,否則返回y值
- or :x爲非0返回x值,否則返回y值
- not:x爲False返回True,否則返回False
- 成員運算符
- in:指定序列找到值返回True,否則返回False
- not in:指定序列沒有找到值返回True,否則返回False
>>> a = 10
>>> b = 5
>>> list = [1, 2, 3, 4, 5]
>>> a in list
False
>>> a not in list
True
>>> b in list
True
>>> b not in list
False
- 身份運算符:用於比較兩個對象的存儲單元
- is:判斷倆標識符是否引自同一個對象
- is not:判斷倆標識符是否引自不同對象
>>> a = 20
>>> b = 20
>>> a is b
True
>>> b = 30
>>> a is b
False
>>> a is not b
True
python中如何使用多進制數字
- python中可以使用十進制、二進制、八進制、十六進制
- 二進制由0、1組成,用 0b 或者 0B作爲前綴表示,bin()可將數字轉爲二進制
- 八進制由數字0-7組成,用 0o 或者 0O作爲前綴表示,oct()可將數字轉爲八進制
- 十六進制由數字 0-15 組成,用 0x 或者 0X作爲前綴表示,hex()可將數字轉爲十六進制
>>> bin(8)
'0b1000'
>>> oct(8)
'0o10'
>>> hex(8)
'0x8'
>>> hex(16)
'0x10'
>>> hex(15)
'0xf'
如何獲取字典中所有鍵
- 使用函數key()
>>> dict = {'1':3, 'a':5, 'haha':55}
>>> dict.keys()
dict_keys(['1', 'a', 'haha'])
標識符爲什麼不建議使用下劃線開頭
在python中下劃線開頭的變量爲私有變量,如果不想讓變量私有,就不建議使用下劃線開頭
如何生聲明多個變量並賦值
兩種方法
>>> a, b, c = 2, 3, 4
>>> a
2
>>> b
3
>>> c
4
>>> a = b = c = 2
>>> a
2
>>> b
2
>>> c
2
什麼是元組的解封裝
>>> tuple = 3, 4, 5 #將3, 4, 5封裝到元組tuple中
>>> tuple
(3, 4, 5)
>>> x, y, z = tuple #將tuple中的值解封裝到變量x, y, z中
>>> x + y + z
12