3.19和3.20? 上課總結:
- 馮諾依曼體系:計算機的基本硬件系統。
輸入設備 ??????????????內存器 ???????????????????輸出設備
CPU(處理器 ,運算器, 寄存器 和多級緩存)
注意(數據流,是先進入內存器,再到CPU,CPU處理完后再到輸出設備。這就導致了處理數據速度的差異,CPU中的數據處理速度快于內存,內存快于磁盤等。而在CPU多級緩存中,一級緩存的速度快于二級緩存,以此類推。)
- python是一門解釋型的動態的高級語言。
動態:不提前規定類型,直接賦值。
解釋型代碼,先換成中間代碼bytecode,再在虛擬機上運行。
- 編程: 算法 +數據結構
算法:是數據如何計算
數據結構: 數據在內存中如何放。
- Python 的解釋器
Cpython是c語言開發的,是python的官方解釋器。
Ipython 是一種交互式的解釋器
Jpython 是一個由Java開發的,跑在Java虛擬機上的字節碼
Pypy 應用動態編譯技術.
- Python的基礎語法
數字的類型:整數int
進制binary? 二進制
Oct???? 八進制
Hex???? 16進制
浮點數 float
復數 ?complex
布爾值 ?bool(true? false)
- 字符串
用‘’ ?或者“” 表示字符串;
‘’‘ ’‘’‘?? “”“ ?“”“?? 使用三個單雙引號可以任意在里面使用單雙引號、換行等。
關注‘‘’ ‘’‘ ?和“”“ ”“” ?的用法,里面的單雙引號一級各種轉義符可以直接用。
上圖感受‘’‘ ’‘’‘ 和“”“ ”“” (三引號)的強大之處,只要在三引號里面,所有的轉義號都不再需要。要換行直接enter鍵,要加單雙引號直接加,然后在jupyter中要記得print,要不然只會輸出其源碼。
沒有三引號的,用單引號或雙引號引用字符串的。
用轉義符和其符號:
\n 換行 ???\t空格鍵 ?????\\ 斜杠
\’ 單引號 ??????\”雙引號
特殊的:r放在最前面,“ ” ‘ ‘ 內的所有轉義都不再起作用。
‘‘’ ‘’‘行位用\,則可以續行
- 標識符(一般用字母開頭,注意 大小寫敏感型)
- 再次強調 python是一門強類型、動態的解釋型語言。
- 運算符:
算術運算:
+? –
a/b???????????? a除以b
a*b???????????? a乘b
a**b??????????? a的b次方
a//b (整除)?? a整除b,只取商的整數部分
a%b (取模)??? a除b 取余
位運算: ??????????都先轉化成二進制
位與 ????????&? ????(都為1才得1,其他得0)
位或 ?????????|????? (有1即得1,其它都為0)
位異或 ??????^????? (兩個位不同才得1,其它為零)
按位取反 ????~?????? ~x? =? -(x+1)
?位左移 ?????>>?????? 8>>2??? 為2 ???也可以 8/ (2的平方)
位右移 ?????<<?????? 6<<2??? 為24? 也可以按6*(2的平方)
(箭頭的尖 ?就是位移動的方向)
- 原碼(寫成二進制格式:9 ==> 0b1001),反碼,補碼2
正數:
原碼,反碼,補碼都是其本身
負數:
原碼: 符號位為1。 ??例:-1 原碼:1000 0001
????? 反碼:符號位不變,其余按位取反。
??????????????????????????? 例:-1反碼:1111 1110
????? 補碼:符號位不變,其余按位取反后加1
??????????????????????????? 例:-1的補碼 1111 1111
?
負數真正在計算機中按補碼儲存。 負數的補碼就是其反碼加1.
?
- 運算符:
算術運算符和位運算符。
比較運算符:
==?? 是否等于
!=?? 是否不等于
<???? 小于 ?????????????????????>?? 大于
>=??? 大于等于 ????????????????<=?? 小于等于
邏輯運算符:
與 and
或 ?or
非 ?not
短路運算符(在邏輯運算符中說的):
and中,如果第一個表達式錯了。那這個表達式就錯了。
Or中,如果第一個表達式對了。那這個表達式就對了。
賦值運算:
+=?? -=? /=? *=?? %=
A= min (1,4)?? max
成員運算:in , ??not in
身份運算:is , ??not is
總結7種運算符
- 算術運算符
+ ,-, * ,/ ,//,%, ** 。
- 位運算
&,|,^,~,>>(位右移)??? <<(位左移)
- 比較運算
==,!=,>,<, >=,<=
- 邏輯運算
and?? or? not
注意and 和or的短路運算
- 賦值運算
+=,-=,、/=,*=,%=、
a = min(1,7)? max
- 位置運算
In? ,not in
- 身份運算
Is? ,not? is
GC用 引用計數的 規則
不要隨便用GC(garbage collection) 垃圾回收機制
單支循環:
If 條件句后面必須是一個bool型,所以會涉及到一個隱形轉換的過程。
真值表:所有空的,只要是空,比如:0,空字符串“ ”,空列表[ ],空元組( ),空字典{ },None (常見的6種假)對應于bool型都是false。
If cond:
Block
注意:if后面的條件必須是bool型。然后冒號: 。
執行條件縮進,形成語句塊
分支循環:對一個條件的判斷,比如輸入一個number,是大于零,小于零,還是等于0.這三個if條件在同一個豎直位置上。
分支嵌套循環:對分支結構的加深理解。
自己存在的喜歡問題:
- if condition后面不加冒號: 2 f后面也有條件句用來判斷
- if后面加bool型條件,所以只走其中一個分支。只要走其中一個,其余的都不會進行。Print要輸出語句,要加“”號,變量的一致性。(>>>)輸入提示符。Len函數的對象是一個字符串。
例:給定一個不超過五位的正整數,判斷其有幾位:
While循環
For 循環
Break
Continue
2.
打印正方形
求100以內偶數的和:
1到5階乘之和
二、函數的內置數據結構
數值型:int,float,complex,bool
序列對象:字符串str????? 列表 list????? tuple 元組
鍵值對: ?集合set??? 字典dict
數字的處理函數:
round
floor
ceil
int
min
max
pow(x,y) ??????????x的y次方
math.sqrt()???????????? x開平方根
進制函數: ??bin()? ?oct?? hex
math.pi
math.e?? 自然常數
type函數
二.list:
- 列表,quenue,stack 和鏈表的區別
List 可變:列表內的元素可以是任意一個對象,故也可以是一個列表。元素可以插入任意位置,也可以從任意位置拿走。
Quenue? 隊列 :元素只能從最前面和最后取出
Stack 只能后進后出,類似摞盤子模型
鏈表:linked list?? 手拉手模型 ??是散落的元素
List,? quenue, stack ,linked list? 是內存常見的數據結構 。
List? 和 linked list? 的區別是:
List是在內存空間中是連續的,而linked list 在內存中是散落的空間。
List可以當函數使用。List()中必須是可迭代對象
可以迭代的:iterable
- 列表的初始化
Lst=[ ]
Lst=list()
Lst=[1,2,3]
Lst=list(range(10))
- list de 初始化過程:
lst=[ ]
lst=list()? new empty list
lst=list(iterable)? (括號中必須是一個可迭代對象)
new list initialized from iterables’ items
- 列表的索引訪問
Lst[index]? 不能越界,否則會拋index error
列表的索引lst.index(元素,start,stop)
返回在lst中找到 該元素 對應的第一個索引值。
通過index函數,括號中是list的元素,最后輸出元素對應的index值(偏移量)
中括號中是index值,找到該位置對應的元素。
- 列表的查詢‘
Lst.index(元素,開始的index,結束的index)
返回的是在(開始index,結束index)中元素第一次出現對應的index值。
只找在索引范圍內的第一個元素值對應的index值
- 列表元素的修改:
列表元素的修改是就地修改,返回值是none
- 列表增加,插入元素
Lst.append()
lst.insert(元素,要插入元素所在的索引值)
append 和insert 最后都是就地修改,返回none,沒有新的列表生成。
還有count()函數。
返回列表中元素出現的的次數
列表的增加extend(iterable) ,就地修改,返回none 即沒有生成新的列表。
列表的+:
生成新的列表,原列表不變,本質調用add函數
列表的*(列表的復制)
注意,在復制的時候a是一個元素,只是這個元素是一個列表,這樣復制的才是一個引用,lst2的元素改變時,a中的元素也會改變。
Lst*(某個值)? 和淺拷貝copy本質上是一樣的
都是復制一個引用,改變某個元素時,別的元素也會改變。但保證復制的時候以一個元素來,只不過這個元素是一個包括幾個元素的額列表
Deepcopy
和淺拷貝用法不同,
生成新的列表,切deep是copy模塊下的類函數,用法是:copy.Deepcopy(需要復制的元素)
a.copy()?? 是淺拷貝的用法
深拷貝 復制的就是元素,生成新的列表。
元組:
元組的初始化:
t=tuple(iterable)
括號中必須是一個可迭代對象,可以是一個列表,也可以是一個元組。
含有一個元素的元組:
t=(1,) 必須有逗號,代表只有一個元素的元組
t.index(value,start,stop) ???元組元素的索引
count(value) ?元組中的元素不可以增刪 改
namedtuple? 的用法
冒泡法總結:
列表中確定某j項:如果從小到大排序,則和j+1項比較,如果lst[j]<lst[j+1]
則兩者互換。 ??I的循環循環,遍歷完lst中的元素。
字符串:
- 用單引號,或雙引號包起來
- 轉義符“\n” 換行
“\t”? 空格
“ \” ” ?引號
“ \’ ” ?單引號
R 放在前面,所有的轉義符號將不起作用
- 三引號里面可以用任意符號。
- 字符串的join函數: 注意格式:“string”.join( iterable)
注意:分隔符格式必須是字符串,可迭代對象中的元素也必須是字符串。
- 字符串通過“+”連接。
- Split 函數
Split(分隔符,maxsplit(分割的刀數))
將字符串按 分隔符 分割成若干片段,然后返回含有字符串的列表。
注:分割的刀數maxsplit為x,則最終的片段數是(x+1)
按某個分隔符切割,分隔符將不存在于切開的片段中。
Split? 默認是從左到右切割。 ??如果要從右到左,則用rsplit
splitlines ([keepends])??? 按照行號分割:\n?? \r? \n\r
默認keepend 是False的,如果括號中寫True時,即要保留行分隔符。
注意用\n? 和\r? ,打印字符串時的區別。
Partition用法:必須有分隔符。
將字符串分割成三個元組:頭,分隔符,尾巴。
三種分割方式的區別:split ,splitlines? partition
字符串的大小寫:
upper 將所有字母都大寫
lower? 將所有字母都小寫
swapcase?? 將大小寫互換
title?? 將每個單詞的首字母大寫
capitalize?? 將句子的首字母大寫
zfill(width)居右邊,左邊用zero 填充,指定寬度。
rfill(width, 填充符號)
lfill (width,填充符號)(左右對齊如果沒有指定填充符號,默認用空格填充)
字符串的修改:
Replace(原來的字符串,要改成的字符串,更改次數)
注意:括號中的前兩者一定要是字符串,【更改次數】不是必須參數。
Strip 的用法:
如果不指定字符,則去掉字符串左右兩邊的額空白字符。
如果指定字符,且用strip。 則去掉左右兩邊 指定中的字符。
Rstrip? 只去掉啊右邊的字符
Lstrip?? 去掉左邊的字符
字符串的查找:
用 ?find(value,開始索引值,結尾索引值)
Rfind?? 從右邊開始找
用index()
用 count ()
以上三種時間復雜度都是O(n)
注意: ?字符串中的value?? 一定是字符串形式,加引號的。
字符串的判斷:
.endswith( )?? 是不是以某個字符結束(注一定是字符串)
.startswith()
Isalnum( ) ??是否是字母和數字組成
Isalpha()??? 是否是字母
Isdecimal()? 是否只包含十進制的數字
Isdigit? 是否全部是數字
Isidentifier?? 是不是字母和下劃線開頭的
Islower???? 是否全是小寫
Isupper???? 是否全部是大寫
Isspace????? 是否包含空白字符
Digit:特殊的單字節的屬于digit
decimal,Numeric:
字符串的格式化: .
列表 ?線性(sequence) ?可變 可以插入
鏈表 支持先進先出 ?后進后出
Stack 摞盤子模型
2018.3.26課程
列表習題
- 求100以內的質數(質數也叫素數)
第一種方法用:一個合數肯定可以分解成多個質數相乘,所以質數的倍數肯定是合數。 ?
?
關注break的用法 :第一個滿足if 條件的,即:可以整除,不輸出i,且后面的循環不在繼續(在2到i開根號之間找到可以被i整除的第一個數j,就可以確定i是合數,i與(j,i**0.5)[不包括j]后面就不用再整除了),就用break。 ?
Continue的作用是:if i/j==0,contine。可以整除:不輸出I,但i還要和j之后的直到(i**0.5)的值循環。(在2到i開根號之間找到第一個可以被i整除的j,接著往下找。上一題中找到第一個可以被i整除的j, 已經可以確定i是合數,而不用繼續i與(2,i**0.5)中除了j 以外的數整除了,故用break)。
所以 break 和continue的區別就是:找到一個滿足if條件的值后是否還要繼續循環
2. 楊輝三角函數。
第一種方法:
??
?
?
2018.3.27課程
字符串
- 一個個 字符 (不是字節)組成的有序的序列,單引號,雙引號。
可迭代和可索引定義不同
- 字符串是不可變對象
而字符串的加法是(把兩個字符串拼接起來)重新定義一個新的字符串(沒有改變原字符串)
Unicode? 字符 ?UTF-8編碼
r? (raw)? 裸字符
字符串可以索引
基本的ANSII 碼 ???換行 \n(linux ,mac)??? \r \n? windows
在python3 中所有的字符都是UTF-8編碼的
但在內存中 ?是Unicode。
字符串是可迭代對象(可索引,不可變)
map 函數 ?一一轉換
用-把 sql中各個字符連接起來
字符串join的用法 ?“ ”.join( )
map函數轉換類型map(a,b)把b類型轉化成a類型
換行新法 ??用“\n”將多個元素連接起來
***
Join 連接的元素 類型必須為字符串類型,如果不同,用map函數轉換。
3字符串的加減 乘
- 字符串的分割
Split
?
Split里的參數為none或等價為none時:
Split():盡可能多的空白字符 ?來分割字符串
Split參數 ?不是none時 :
Split(sep,maxsplit) ??sep 分隔符 ??maxsplit? 為最大分割次數
Rsplit? 為倒著切
倒著切一刀,然后再做負索引。
Partition 函數 :切一刀
Str. 函數Upper??? 調用str的upper方法
用戶輸入,然后可統一大小寫。
Title? capltalize?? center 函數
Format 函數。。。
字符串的修改。
為什么能修改:因為它返回一個新的字符串。
strip函數:默認情況下,去掉兩邊的空白字符
Strip() 在左右兩邊 去除,凡是在字符集里的就去掉
Enumerate
?
Replace 函數
?
- * 冒泡排序法定義:(考排序和算法)
交換排序中最基本的算法
基本的排序方法: ??冒泡排序?
?
2018.3.29
1.字符串的格式化
??Join函數(拼接的必須是 字符串類型的)
%03d???
占位符:
Precision (精度)
?
{ }? 有冒號:意為開始限定格式。
format函數返回一個字符串
時分秒小寫
前面是占位符后面是format函數
:后面的數字為寬度。點后面的為點為幾位加“f”
區分:數字的精度,寬度和有效數字。
16:00
字符串和編碼有關,字節和編碼無關。
- 定義:
Bytes:不可變的有序的字節序列
Bytearrary: 可變有序的字節序列
- 對字符串進行編碼:
a.encode() (意為對a進行編碼encode,括號里沒有值,則默認是用utf-8) 返回的是bites型,注意不是字符串。
- 下面是對a986的bites進行解碼(decode),用utf-8,輸出是字符串。
b” ”.decode( )
從字符串到bytes是編碼,從bites到字符串是解碼過程。
ASCII
Unicode-8是便于網絡傳輸的編碼
字符串前面加b,就是字節byte。
Encode 編碼 ??decode 解碼
字符序列和字節序列
Bytearray 可以當做是byte的副本,只是bytearray可變。Byte 和bytearray(都是字節)與編碼無關。
Byte和bytearray 只是內存中存儲的字節序列
字節和數字相關 ????字符和編碼相關
UTF-8 包括所有的ASCII 碼
Bytearray 可變
后面的數必須是從0到255 內的數
Byte 很重要 ?和字符串對比
可以索引的數據結構:
列表,元組,字符串,bytes??? bytearray
索引:下標 ?,index
切片【 start,stop,step】如果start和stop都為負數,步數也應該是負的。默認是正軸向右增加。。
直接在lst這個對象上倒著數 ,而for c in range[::-1]中會相當于copy一個新對象。
所以要倒著打印,用reverse更高效,不占用內存。
例題:輸入一個多位數,輸出它的位數,輸出它每一位數出現的次數,將它的每一位從最高到最低輸出
2018.4.2??
上午將習題
練習講解:
- 階乘
- 轉置矩陣
3.
Enumerate的用法:? 列舉
考點:
快速排序
矩陣: 二維 ?替換
交換排序:冒泡 ?bubble sort??
階乘
冒泡排序:
?
?
?
?
?
?
簡單快速排序:
?
?
簡單排序法的優化:
?
?
優化方法1: ?最大值和最小值同時找,那比較次數就會折半。 ??#? 二元排序法
?
?
優化方法2:特殊列表 ?
?????????? 【1,1,1,1,1,1,1,3】
第一趟下來:【3,1,1,1,1,1,1,1】
????????? 當lst【maxindex】=【miniindex】時,說明中間有相同的值。。。
?
冒泡排序法的優化是加flag
?交換排序: ?????冒泡排序 ????(時間復雜度為n平方)
?選擇排序: ?????簡單排序法 ???(時間復雜度n 平方)
?
?選擇排序的性能優于交換排序,因為交換排序 替換次數減少 。
?
?
?
Dict
?
?
?
?
?
4.2號 ?16點課程: ????字典很重要
??列表list
??集合
??字典 ????非常重要的數字結構
? 初始化:d ={ }? (和set空集合的比較)
????????? d= dict( ) ???內部的必須是鍵值對 ????二元結構
?Key=》value??? 字典里必須是鍵值對,兩個鍵值對之間用逗號隔開
字典得無序體現在key的無序,
set的無序體現在元素的額無序。
沒有d.pop()?? ,因為dict是無序的,pop 沒有參數的話,是從尾部彈出,而dict沒有尾部。所以不正確
?
?
Del 語句:
刪除的究竟是哪個
Get? 得到 ??缺省值
字典迭代過程中 ?不能增刪元素 ??
?
?
比下來有最大值,固定在某一個位置。 ?
?
?
?
迭代過程中不允許改變字典size(比如增刪元素),用如下方法。
?
?
?
?
?
?
?
有序字典 ??ordereddict
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
2018.4.3?
昨天習題
?
第二個題:
?
?
?
第三題:
?
?
一個東西出現多少次: 用字典。 累加。。列表,字典。
去重,用set。
?
生成隨機數據的一般用法。
Sorted 函數,如果類型不同,加key值。
?
字典中按item? 和key排序。。
?
?隨機取出字符串的三種方法。
按key排序
按value排序
新課:
Python的解釋器和生成器。
Import datetime
datetime.datetime()?? 第二個datetime 是一個類
?
?
datetime.datetime.(重要的是格式化和timedelta)
datetime下有datetime 和timedelta
?
第一個是調入函數。第二個是類、strptime 是類下的方法。
?
時間對象 +- 時間變量對象 ?
?
?
?兩者不同
列表解析式: ?迭代的時候由【 】不斷收集每次算出的結果
?
和上面的第一個進行比較。下面list后面加的是一個可迭代對象。上面sorted中是一個對象
【 】等價于for循環中的append?
第一個print輸出(range10)。而【】將其中print(i)回的none組合成列表
?
?
?
?
?
列表解析式打印九九乘法表
?
?
Formate函數的應用
?
?
16:00
?
?
生成器表達式 :
?
生成器對象
生成器表達式是按需計算(惰性計算,惰性求值 )用的時候返回一個生成器對象。而列表直接生成。用next函數撥到下一個。
而列表解析式 ?立即返回一個列表 ?
?
生成器:
(迭代器一定可迭代,)
迭代器從前到后走一遍不可回頭,列表走完一遍后,可以重新迭代。
生成器表達式 ??生成一個生成器對象
Val? 返回一個none?
Val? 不能加 ?
?
生成器解析式和列表解析式的對比:
- 生成器:延遲計算。 列表解析式:立即生成。
- 生成器沒有數據,內存占用極少,使用時一個一個返回。
而列表解析式構造新的列表要占用內存。
- 生成器解釋器將計算時間分散。
列表解析式耗時較多。
?
不可哈希 ?所以無法返回
生成一個列表,列表里面是int型
?
集合中有lst,lst不可哈希。
?
字典中key可hash就OK啦,value不限制
?
?
三種解析式: 集合解析式
???????????? 字典解析式 ??chr()? 阿斯可碼
生成字典中的3個元素
?
生成器對象是一個迭代器,所以一定是一個可迭代對象
迭代器 不一定是生成器對象
?
?
?
內建函數:
Id
? type不僅是一個內建函數,還是一個類。
Print的用法。。
Bool 型是int的一個子類
?
10000位的保留,剩下的迭代
Sum 正常 是累加和,20 再累加。
返回一個元素
字典不是sequence,不能reversed
Sorted 一定能排大小個
Next三次后,一直是100.
字典得遍歷和可迭代對象的遍歷
可迭代對象 ??迭代器 ?生成器 的概念非常重要
用itei可以將可迭代對象分裝成迭代器
Zip? 函數 也是惰性求值
2018年4.10.2018
函數
功能劃分,分裝,復用
分類:內建函數
庫函數
函數的結構:函數的定義(藍色部分)和調用。
Def? define (定義)
結構:
def 函數名(參數) ?【申明函數是誰和參數】
(縮進四個數) 代碼塊
Return 返回值
定義時的參數列表是形參。
調用的時候,用函數名加括號,調用時用的參數是實參。
Callable:可以調用的
形參和實參 是在區別函數定義和調用的時候說的
函數的參數(要掌握):
傳參的方式:
位置參數: ?必須有順序
關鍵字參數(keyword): ?順序可以打亂 ??因為是x=… 的形式
形參有幾個,必須傳入幾個參數
位置參數和關鍵字參數可以混用,但位置參數必須放在關鍵字參數前面
缺省值(4,5)
常見錯誤類型:
沒有缺省值得必須放在有缺省值前面。(即簡單的放在前面)
函數參數的默認值得作用:
Pot:端口
位置參數的可變參數:
*表示可以接受0個或多個,有多個實參時 收集為一個tuple. 零個時為空tuple.
關鍵字參數的可變參數:
**關鍵字參數的可變參數,可以接收多個關鍵字參數,收集的實參名稱和值組成一個字典。
(*的參數)可變的參數都可以不給
可變參數,只在def() 中加*,一個*表示位置參數,兩個*表示關鍵字參數。但在語句塊中不加*。
定義參數和傳參的整體邏輯: 簡單的放在前面,不帶*的放在前面。一定要記得輸出打印,打印是可變參數不能加*。
可變參數在第一位的時候,x . y 已經是關鍵字參數,而不是位置參數。
X,? y是keyword參數。傳入時要按關鍵字參數傳入,且先滿足x,y 再滿足可變參數。
語法錯誤
只能傳入兩個參數,作用是將x,y 變成keyword-only參數
三個都必須給,且x y? 必須是位置參數:x=…,y=。。。
keyword-only經常會伴隨缺省值
上午總結:
4.10 pm:
參數的解構:
對字典參數的解構:
❤
- 11號 上午
返回值和作用域:
Return的返回值:
函數的作用:復用和封裝。
Return語句的本質和break類似。
函數如果執行了一個return語句,就會結束。想到函數的本質,y=f(x),給定一個x,只有唯一的y值。 ?沒有reture,就默認返回none。
Assignment 賦值
閉包: 外部的作用域應用于內部
作用域很重要
全局:整個程序運行的環境
局部:
X+=1? 賦值即定義
內層函數 用到外層函數(不是全局的)的自由變量 ????就是閉包
Nonlocal
Frames? 幁
遞歸函數:函數直接或間接調用自己,就是遞歸。
Const? 常量
棧一層一層壓
遞歸函數:
練習:
階乘:
將1234 逆序排列
- 猴子吃桃:
匿名函數:
Lambda 函數
(lambda : (表達式) ??只能寫一行
如何執行
生成器函數:
Yield 出現的函數 ?就是生成器對象
Yield 本意是讓出的意思 ?不會立即執行
進程 ?線程
Yield from語法塊
- 周二 函數本質總結,以及傳參,以及作用域。
遞歸函數
復習:
函數的定義,作用域,封裝,調用的概念。(每個語言都通用)
函數的作用:復用,封裝
函數的定義,參數,返回值 ,定義域,函數遞歸。
函數的返回值只能有一個,python中函數都有返回值。
作用域:重要的概念。
內部函數用到外部函數的變量
Global 可以將內部的變量申明為全局變量。一般不用,破壞了函數的封裝。 ?函數是用來復用和封裝的。
LEGB
閉包:內層函數調用外層函數的變量
Nonelocal: 變量在上一層的局部作用域中定義。
默認值的作用域:
函數的標識符只是代指“一個對象”
全局的:
外層的變量內層可以看到。內層的外層看不到。
Build in? 相當于全局的。 ??LEGB? 原則
函數的銷毀:本質還是用的引用計數。
遞歸函數定義:
自己直接或間接調用自己。
一定要有邊界
調用函數:相當于摞盤子,調用了內部函數,必須先將這個函數調走,才能回到原來的函數。
遞歸函數:階乘和斐波那契數列 ?遞歸函數
函數的本質:一個黑匣子,可以里面傳參數。 函數內部如何設計。
生成器很重要
生成器的生成: ?函數和表達式(函數里面有yield)
生成器(函數)調用時:返回的就是生成器對象(yield )。
生成器一般放在for循環中。
生成器重要:
生成器的優勢:惰性求值。
懶處理
預加載(本質:緩存)
樹的概念(懂):
結點
基本的數據結構:
一個前驅,后驅可以有
樹的度:分叉的最大數
樹的層次:分幾層
路徑,深度,
二叉樹(重要):一個樹上分兩個支
二叉樹的性質,如何算它的節點。(2的對數)
滿二叉樹:
完全二叉樹:
堆排序:用完全二叉樹的性質
樹的節點之間不允許交叉
二叉樹的性質5:
?
?
?
?
?
高階函數和科里化:
Y=g(f(x))
接受一個或多個函數作為參數
?
映射:
函數的本質:自由的對象
函數名就是標識符
高級函數:參數中傳入函數,
Nonelocal
Sorted? 函數的高階函數
Filter(過濾器,數據清洗,過濾)
Map 映射(可迭代對象的每一個元素的形式轉化)里面用lambda函數)
4.17下午(2點):
Zip函數
Enumerate 函數
函數的currying:
將一個接受兩個參數的函數轉化成接收一個參數的函數。
將Z=F(x,y)的函數轉化為:z=f(x)(y)
t的作用調用外層函數add(),調回內層函數的對象_add()。
閉包的定義:內層函數引用外層函數的變量。(上面例子中用到了閉包)
裝飾器:
Print函數不屬于業務代碼,屬于侵入代碼。
函數調用必須在定義之后,但幾個函數定義的時候沒有先后順序
@logger? 后add1已經是_logger了,被包裝函數add1。
Python中的裝飾器重要
@logger 是裝飾器語法
耦合度:dependency ?一個程序中,模塊和模塊之間的依賴度。
只要定義一個新函數,就會開辟一個新的作用域。
裝飾器的語法(非常重要):@ logger
后面是被包裝函數。(函數作用域,閉包,可變參數,嵌套函數,函數的調用,一切皆對象)
裝飾器的本質是一個函數,將被包裝函數業務增強,且是非侵入式的函數。
Python文檔字符串()相當于注釋:
標識符是為了識別,與內存對象建立關系。
標識符和名稱并不是一一對應的。
無參裝飾器
帶參裝飾器(),如何克里化的
被包裝函數名稱被改變。所以用functiontools
裝飾器的定義:
一個函數,用這個函數采用非侵入代碼來增強另一個函數的功能,[被wrapped函數]作為裝飾器的參數。
嵌套函數,克里化。
4.19號課程:
文檔注釋:
靜態:變量先申明類型,編譯期就可以發現變量類型是否匹配。
動態型:運行到某處時,才會拋異常。
解決動態語言的編譯的弊端,用文檔注釋(不是強制性的)
Annotation
加入文檔字符串。 (說明文檔功能和變量類型)(可用help調用)
Annotation :參數類型
返回值類型
#: 字符串中最外層用單引號:內層引用時
add.__annotation__返回一個字典(無序)
Parameters ?參數們
Callable 可調用對象 : ?函數可調用。
可變參數:沒必要加類型注解。(本身就是收集不同類型的參數)
參數標識符中沒有*,*只是形式參數的。
Python中parameters . kind中其實沒有(關鍵字參數)的類
@property? 屬性裝飾器
Parameter 的kind
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96524