python summary(for previous 6 weeks)

Meghan(haven’t been fullly organized)

 

3.19和3.20? 上課總結:

  1. 馮諾依曼體系:計算機的基本硬件系統。

 

輸入設備 ??????????????內存器 ???????????????????輸出設備

 

CPU(處理器 ,運算器, 寄存器 和多級緩存)

 

注意(數據流,是先進入內存器,再到CPU,CPU處理完后再到輸出設備。這就導致了處理數據速度的差異,CPU中的數據處理速度快于內存,內存快于磁盤等。而在CPU多級緩存中,一級緩存的速度快于二級緩存,以此類推。)

 

  1. python是一門解釋型的動態的高級語言。

動態:不提前規定類型,直接賦值。

解釋型代碼,先換成中間代碼bytecode,再在虛擬機上運行。

 

  1. 編程: 算法 +數據結構

算法:是數據如何計算

數據結構: 數據在內存中如何放。

  1. Python 的解釋器

Cpython是c語言開發的,是python的官方解釋器。

Ipython 是一種交互式的解釋器

Jpython 是一個由Java開發的,跑在Java虛擬機上的字節碼

Pypy 應用動態編譯技術.

  1. Python的基礎語法

數字的類型:整數int

進制binary? 二進制

Oct???? 八進制

Hex???? 16進制

浮點數 float

復數 ?complex

布爾值 ?bool(true? false)

  1. 字符串

用‘’ ?或者“” 表示字符串;

‘’‘ ’‘’‘?? “”“ ?“”“?? 使用三個單雙引號可以任意在里面使用單雙引號、換行等。

關注‘‘’ ‘’‘ ?和“”“ ”“” ?的用法,里面的單雙引號一級各種轉義符可以直接用。

上圖感受‘’‘ ’‘’‘ 和“”“ ”“” (三引號)的強大之處,只要在三引號里面,所有的轉義號都不再需要。要換行直接enter鍵,要加單雙引號直接加,然后在jupyter中要記得print,要不然只會輸出其源碼。

沒有三引號的,用單引號或雙引號引用字符串的。

用轉義符和其符號:

\n 換行 ???\t空格鍵 ?????\\ 斜杠

\’ 單引號 ??????\”雙引號

特殊的:r放在最前面,“ ” ‘ ‘ 內的所有轉義都不再起作用。

‘‘’ ‘’‘行位用\,則可以續行

  1. 標識符(一般用字母開頭,注意 大小寫敏感型
  2. 再次強調 python是一門強類型、動態的解釋型語言。
  3. 運算符:

 

算術運算:

+? –

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的平方)

(箭頭的尖 ?就是位移動的方向)

  1. 原碼(寫成二進制格式:9 ==> 0b1001),反碼,補碼2

正數

原碼,反碼,補碼都是其本身

負數

原碼: 符號位為1。 ??例:-1 原碼:1000 0001

????? 反碼:符號位不變,其余按位取反。

??????????????????????????? 例:-1反碼:1111 1110

????? 補碼:符號位不變,其余按位取反后加1

??????????????????????????? 例:-1的補碼 1111 1111

?

負數真正在計算機中按補碼儲存。 負數的補碼就是其反碼加1.

?

  1. 運算符:

算術運算符和位運算符。

 

比較運算符:

==?? 是否等于

!=?? 是否不等于

<???? 小于 ?????????????????????>?? 大于

>=??? 大于等于 ????????????????<=?? 小于等于

 

邏輯運算符:

與 and

或 ?or

非 ?not

短路運算符(在邏輯運算符中說的):

and中,如果第一個表達式錯了。那這個表達式就錯了。

Or中,如果第一個表達式對了。那這個表達式就對了。

 

賦值運算:

+=?? -=? /=? *=?? %=

A= min (1,4)?? max

成員運算:in , ??not in

 

 

身份運算:is , ??not is

總結7種運算符

  1. 算術運算符

+ ,-, * ,/ ,//,%, ** 。

  1. 位運算

&,|,^,~,>>(位右移)??? <<(位左移)

  1. 比較運算

==,!=,>,<, >=,<=

  1. 邏輯運算

and?? or? not

注意and 和or的短路運算

  1. 賦值運算

+=,-=,、/=,*=,%=、

a = min(1,7)? max

  1. 位置運算

In? ,not in

  1. 身份運算

Is? ,not? is

 

GC用 引用計數的 規則

不要隨便用GC(garbage collection) 垃圾回收機制

 

單支循環:

If 條件句后面必須是一個bool型,所以會涉及到一個隱形轉換的過程。

真值表:所有空的,只要是空,比如:0,空字符串“ ”,空列表[ ],空元組( ),空字典{ },None (常見的6種假)對應于bool型都是false。

If cond:

Block

注意:if后面的條件必須是bool型。然后冒號: 。

執行條件縮進,形成語句塊

分支循環:對一個條件的判斷,比如輸入一個number,是大于零,小于零,還是等于0.這三個if條件在同一個豎直位置上。

分支嵌套循環:對分支結構的加深理解。

自己存在的喜歡問題:

  1. if condition后面不加冒號: 2 f后面也有條件句用來判斷
  2. 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:

  1. 列表,quenue,stack 和鏈表的區別

List 可變:列表內的元素可以是任意一個對象,故也可以是一個列表。元素可以插入任意位置,也可以從任意位置拿走。

Quenue? 隊列 :元素只能從最前面和最后取出

Stack 只能后進后出,類似摞盤子模型

鏈表:linked list?? 手拉手模型 ??是散落的元素

 

List,? quenue, stack ,linked list? 是內存常見的數據結構 。

 

List? 和 linked list? 的區別是:

List是在內存空間中是連續的,而linked list 在內存中是散落的空間。

 

List可以當函數使用。List()中必須是可迭代對象

可以迭代的:iterable

  1. 列表的初始化

Lst=[ ]

Lst=list()

Lst=[1,2,3]

Lst=list(range(10))

  1. list de 初始化過程:

lst=[ ]

lst=list()? new empty list

lst=list(iterable)? (括號中必須是一個可迭代對象)

new list initialized from iterables’ items

  1. 列表的索引訪問

Lst[index]? 不能越界,否則會拋index error

列表的索引lst.index(元素,start,stop)

返回在lst中找到 該元素 對應的第一個索引值。

通過index函數,括號中是list的元素,最后輸出元素對應的index值(偏移量)

中括號中是index值,找到該位置對應的元素。

 

  1. 列表的查詢‘

Lst.index(元素,開始的index,結束的index)

返回的是在(開始index,結束index)中元素第一次出現對應的index值。

只找在索引范圍內的第一個元素值對應的index值

  1. 列表元素的修改:

列表元素的修改是就地修改,返回值是none

 

  1. 列表增加,插入元素

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中的元素。

字符串:

  1. 用單引號,或雙引號包起來
  2. 轉義符“\n” 換行

“\t”? 空格

“ \” ” ?引號

“ \’ ” ?單引號

R 放在前面,所有的轉義符號將不起作用

  1. 三引號里面可以用任意符號。
  2. 字符串的join函數: 注意格式:“string”.join( iterable)

注意:分隔符格式必須是字符串,可迭代對象中的元素也必須是字符串。

  1. 字符串通過“+”連接。
  2. 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課程

列表習題

  1. 求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課程

字符串

  1. 一個個 字符 (不是字節)組成的有序的序列,單引號,雙引號。

可迭代和可索引定義不同

  1. 字符串是不可變對象

而字符串的加法是(把兩個字符串拼接起來)重新定義一個新的字符串(沒有改變原字符串)

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字符串的加減 乘

  1. 字符串的分割

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

字符串和編碼有關,字節和編碼無關。

  1. 定義:

Bytes:不可變的有序的字節序列

Bytearrary: 可變有序的字節序列

  1. 對字符串進行編碼:

a.encode() (意為對a進行編碼encode,括號里沒有值,則默認是用utf-8) 返回的是bites型,注意不是字符串。

  1. 下面是對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??

 

上午將習題

 

練習講解:

 

 

  1. 階乘

 

 

  1. 轉置矩陣

 

 

 

 

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? 不能加 ?

?

生成器解析式和列表解析式的對比:

  1. 生成器:延遲計算。 列表解析式:立即生成。
  2. 生成器沒有數據,內存占用極少,使用時一個一個返回。

而列表解析式構造新的列表要占用內存。

  1. 生成器解釋器將計算時間分散。

列表解析式耗時較多。

?

不可哈希 ?所以無法返回

生成一個列表,列表里面是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:

參數的解構:

 

對字典參數的解構:

 

 

  1. 11號 上午

返回值和作用域:

Return的返回值:

函數的作用:復用和封裝。

 

Return語句的本質和break類似。

函數如果執行了一個return語句,就會結束。想到函數的本質,y=f(x),給定一個x,只有唯一的y值。 ?沒有reture,就默認返回none。

Assignment 賦值

 

 

 

閉包: 外部的作用域應用于內部

 

 

 

作用域很重要

全局:整個程序運行的環境

局部:

X+=1? 賦值即定義

內層函數 用到外層函數(不是全局的)的自由變量 ????就是閉包

 

Nonlocal

 

Frames? 幁

遞歸函數:函數直接或間接調用自己,就是遞歸。

Const? 常量

棧一層一層壓

 

 

遞歸函數:

 

練習:

階乘:

將1234 逆序排列

  1. 猴子吃桃:

 

匿名函數:

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

(1)
meghanmeghan
上一篇 2018-04-18
下一篇 2018-04-19

相關推薦

欧美性久久久久