函數,作用域,樹,簡介
阿新 • • 發佈:2018-08-25
完全二叉樹 python2 叠代器 作用 交換 二叉樹性質 數值 不可見 生成 函數嵌套
在一個函數中定義了另一個函數
函數有可見範圍,這就是 作用域 概念
內部函數不能在外部直接使用,會拋NameError異常,因為它不可見
作用域
一個標識符的可見範圍,這就是標識符的作用域。一般常說的是變量的作用域
全局作用域
在整個程序運行環境中都可見
局部作用域
在函數、類等內部可見
局部變量使用範圍不能超過其所在局部作用域
全局變量global
x = 5 def foo(): global x x += 1 使用global關鍵字變量,將foo內的x聲明為使用外部的全局作用域中定義的x 全局作用域中必須有x的定義 內部作用域使用x = 5 之類的賦值語句會重新定義局部作用域使用的變量x,但是一旦這個作用域中使用global聲明x為全局的,那麽x= 5相當於在全局作用域的變量x 賦值
nonlocal
使用了nonlocal關鍵字,將變量標記為不在本地作用域定義,而在上級的某一級局部作用域中定義,但不能是全局作用域中定義
內部函數使用nonlocal 關鍵字聲明變量在上級作用域而非本地作用域中定義
閉包
自由變量:未在本地作用域中定義的變量
閉包: 就是一個概念,出現在嵌套函數中,指的是內層函數引用到了外層函數的自由變量,就形成了閉包。
變量名解析原則LEGB
local 本地作用域、局部作用域的local命名空間。函數調用時創建,調用結束時消亡 Enclosing,Python2.2時引入了嵌套函數,實現了閉包,這個就是嵌套函數的外部函數命名空間 Global,全局作用域,即一個模塊的命名空間,函數被import時創建,解釋器退出時消亡 Build-in 內建模塊的命名空間,生命周期從python解釋器啟動時創建到解釋器退出時消亡。
遞歸
自己調用自己
匿名函數 Python 借助Lambda表達式構建匿名函數
格式:
lambda 參數列表 :表達式
參數列表不需要小括號
冒號是用來分割參數列表和表達式的
不需要用return,表達式的值,就是匿名函數返回值
lambda表達式(匿名函數)只能寫在一行上,被稱為單行函數
生成器
生成器generator 生成器是指生成器對象,可以由生成器表達式得到,也可以使用yield關鍵字得到一個生成器函數,調用這個函數得到一個生成器對象 生成器函數 函數體中包含yield語句的函數,返回生成器對象 生成器對象,是一個可叠代對象,是一個叠代器 生成器對象,是延遲計算、惰性求值的 包含yield語句的生成器函數生成 生成器對象的時候,生成器函數體不會立即執行 next(generator)會從函數的當前位置向後執行到之後碰到的第一個yield 語句,會彈出值,並暫停函數執行 再次執行next函數,和上一條一樣的處理過程 沒有多余的yield語句能被執行,繼續調用next函數,會拋出StopIteration異常
樹
普通定義
非線性結構,每個元素可以有多個前驅和後繼
樹是n(n>=0) 個元素的集合
n= 0 時,為空樹
樹只有一個特殊的沒有前驅的元素,稱為樹的根Root
樹中除了根節點外,其余只能有一個前驅,可以有零個或多個後繼
遞歸定義
樹T是n(n>=0)個元素的集合。n=0時,稱為空樹
有且只有一個特殊元素根,剩余元素都可以被劃分為m個互補相交的集合T1、T2、...T m,每一個集合都是樹,稱為T的樹Subtree
子樹也有自己的根
概念
結點 :樹中的數據元素
結點的度degree:結點擁有子樹的數目稱為度,記作d(v)
葉子結點:結點的度為0,稱為葉子結點leaf、終端結點、末端節點
分支結點:結點的度不為0,稱為非終端結點或分支結點
分支:結點之間的關系
內部結點:除去根和葉子結點外的分支結點
樹的度是樹內各結點的度的最大值
結點的層次(Level):根結點為第一次層,根的孩子為第二層,以此類推,記作L(v)
樹的深度(高度):樹的層次的最大值
有序樹:結點是子樹是有順序的,不能交換
無序樹:結點的子樹是無順序的,可以交換
路徑:樹中的k個結點n1,n2...nk,滿足ni是n(i+1)的雙親,成為n1到nk的一條路徑。就是一條線串下來的,前一個都是後一個的前驅結點
路徑長度 = 路徑上的節點數-1,也就是分支數
森林:m(m>=0)棵不相交的樹 集合
對於結點而言,其子樹的集合就是森林。
樹的特點
唯一的根
子樹不相交
除了根以外,每個元素都只能有一個前驅,可以有零個或多個後繼
根結點沒有雙親結點(前驅),葉子結點沒有孩子結點(後繼)
雙親結點比孩子結點的層次小1
二叉樹
每個結點最多有兩個子樹
二叉樹不存在度數大於2 的結點
它是有序樹,左子樹,右子樹是有順序的,不能交換順序
即使某個結點只有一顆子樹,也要確定它是左子樹還是右子樹
二叉樹的五種基本形態
空二叉樹
只有一個根結點
根節點只有左子樹
根節點只有右子樹
根結點有左子樹和右子樹
斜樹
左斜樹,所有的結點都只有左子樹
右斜樹,所有的結點都只有右子樹
滿二叉樹
一個二叉樹的所有分支結點都存在左子樹和右子樹,並且所有的葉子結點都只存在在最下面一層
同樣深度二叉樹中,滿二叉樹結點最多
k 為深度(1<=n),則結點總數為2^k-1
完全二叉樹Complete Binary Tree
若二叉樹的深度為k,二叉樹的層數從1到k-1層的結點數都達到了最大個數,在第k層的結點都集中在最左邊,這就是完全二叉樹
完全二叉樹由滿二叉樹引出
滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹
k為深度(1<=k<=n),則結點總數最大值為2^k-1,當達到最大值的時候就是滿二叉樹
二叉樹性質
高度為k的二叉樹,至少有K個結點
含有n(n>=1)的結點的二叉樹高度至多為n。最小為math.ceil(log2(n+1)),不小於對數值的最小整數,向上取整
具有n個結點的完全二叉樹的深度為int(log2n)+1或者math.ceil(log2(n+1))
函數,作用域,樹,簡介