天天看點

python 作用域,continue和break的差別,深拷貝和淺拷貝,

1**.python當中continue和break 語句的差別**:

*break是指跳出整個循環,程式結束

continue是指跳出目前循環,但是會繼續執行下一個循環

*python中函數作用域

1、作用域

如果一個變量在def内指派,它被定位在這個函數内

如果一個變量在一個嵌套的def中指派,對于嵌套的函數來說,它非本地的

如果在def之外指派,他就是整個檔案

2、在互動式模式下,其實是在一個名為__main__的模闆内。

3、一個函數的内部的任何類型的指派都會把一個名稱劃定為本地的。這包括=語句,import中的模闆名稱,def中的函數名稱,函數參數名稱等。如果在一個def中以任意方式指派的名稱,他都将對于該函數是本地的。

注意:原處改變對象并不會把變量劃分為本地變量。

4、變量名解析:LEGB原則

1變量名引用分為三個作用域進行查找:首先是本地,然後是函數内(如果有的話),之後是全局的,最後是内置的

2預設情況下,變量名指派會建立或者改變本地變量

3全局聲明和非本地聲明将指派的變量名映射到模闆檔案的内部作用域。

4當在函數中使用未認證的變量名時,python搜尋4個作用域(本地作用域,之後是上一層次中的def或者lambda的本地作用域,之後是全局,最後是内置的)并且在第一處能找到這個變量的地方停下來,如果變量名在這個過程中沒有找到則會報錯。

5、内置作用域

内置作用域僅僅是一個名為builtins内置模闆,要在import builtins才能使用

import builtins

print(dir(builtins))

6、全局變量

全局變量是位于模闆檔案内部的頂層的變量名

全局變量如果在函數内部被指派的話,必須經過聲明

全局變量在函數的内部不經過聲明也可以被引用

7、工廠函數(閉合函數)

一個能夠記住嵌套作用變量的函數

例如:

def maker(N):

def action(X):

return XN

return action

f = maker(2)

print(f(2)) #輸出9

8、這個例子需要思考:

def f():

a = []

for i in range(5):

a.append(lambda x ;ix)

return a

t = f()

print(t0) #輸出16

print(t1,t2) #輸出16,16

解釋:因為for循環結束後,i的值是4,記住這個i=4,是以當調用時,x的值才被傳進來。

解決辦法是使用預設參數:

def f():

a = []

for i in range(5):

a.append(lambda x,i=i ;i**x) #這裡的i等于這次循環時的i

return a

t = f()

print(t0) #輸出0

print(t1,t2) #輸出2,4

9、nonlocal使用舉例

def tester(start):

state = start

def nested(label):

nonlocal state #如果沒有這個,下面的是state+=1不行的

print(label,state)

state+=1

return nested

什麼是閉包?

如果在一個函數的内部定義了另一個函數,外部的我們叫它外函數,内部的我們叫它内函數。在一個外函數中定義了一個内函數,内函數裡運用了外函數的臨時變量,并且外函數的傳回值是内函數的引用。這樣就構成了一個閉包。

一般情況下,在我們認知當中,如果一個函數結束,函數的内部所有東西都會釋放掉,還給記憶體,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量将來會在内部函數中用到,就把這個臨時變量綁定給了内部函數,然後自己再結束。

copy()和deeepcopy() 的差別:

–深複制,即将被複制對象完全再複制一遍作為獨立的新個體單獨存在。是以改變原有被複制對象不會對已經複制出來的新對象産生影響。

—–而淺複制等于指派,并不會産生一個獨立的對象單獨存在,他隻是将原有的資料塊打上一個新标簽,是以當其中一個标簽被改變的時候,資料塊就會發生變化,另一個标簽也會随之改變。

—–而淺複制要分兩種情況進行讨論:

1)當淺複制的值是不可變對象(數值,字元串,元組)時和“等于指派”的情況一樣,對象的id值與淺複制原來的值相同。

2)當淺複制的值是可變對象(清單和元組)時會産生一個“不是那麼獨立的對象”存在。有兩種情況:

第一種情況:複制的 對象中無 複雜 子對象,原來值的改變并不會影響淺複制的值,同時淺複制的值改變也并不會影響原來的值。原來值的id值與淺複制原來的值不同。

第二種情況:複制的對象中有 複雜 子對象 (例如清單中的一個子元素是一個清單),如果不改變其中複雜子對象,淺複制的值改變并不會影響原來的值。 但是改變原來的值 中的複雜子對象的值 會影響淺複制的值。

一***)什麼是lambda函數:***

Python支援一種有趣的文法,它允許你快速定義單行的最小函數。這些叫做lambda的函數是從Lisp中借用來的,可以被用在任何需要函數的地方。

lambda 函數是一個可以接收任意多個參數(包括可選參數)并且傳回單個表達式值的匿名函數。 (注意:lambda 函數不能包含指令,它們所包含的表達式也不能超過一個)

(二)使用lambda函數的好處:

1、lambda函數比較輕便,即用即扔,很适合需要完成某一項簡單功能,但是這個簡單的功能隻在此一處使用,連名字都很随意的情況下;

2、lambda是匿名函數,一般用來給filter,map,reduce這樣的函數式程式設計服務;

3、作為回調函數,可以傳遞給某些應用,比如消息處理等。

Python生成随機數的方法

random.random()用于生成用于生成一個指定範圍内的随機符點數,兩個參數其中一個是上限,一個是下限。如果a > b,則生成随機數

1 n: a <= n <= b。如果 a <b, 則 b <= n <= a

print random.uniform(10, 20)

print random.uniform(20, 10)

#----

#18.7356606526

#12.5798298022

random.randint

用于生成一個指定範圍内的整數。其中參數a是下限,參數b是上限,Python生成随機數

print random.randint(12, 20) #生成的随機數n: 12 <= n <= 20

print random.randint(20, 20) #結果永遠是20

#print random.randint(20, 10) #該語句是錯誤的。

下限必須小于上限。

random.randrange

從指定範圍内,按指定基數遞增的集合中 ,這篇文章就是對python生成随機數的應用程式的部分介紹。

随機整數:

import random

random.randint(0,99)

21

随機選取0到100間的偶數:

import random

random.randrange(0, 101, 2)

42

随機浮點數:

import random

random.random()

0.85415370477785668

random.uniform(1, 10)

5.4221167969800881

随機字元:

import random

random.choice(‘abcdefg&#%^*f’)

‘d’

多個字元中選取特定數量的字元:

import random

random.sample(‘abcdefghij’,3)

[‘a’, ‘d’, ‘b’]

多個字元中選取特定數量的字元組成新字元串:

import random

import string

string.join(random.sample([‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’], 3)).r

eplace(" “,”")

‘fih’

随機選取字元串:

import random

random.choice ( [‘apple’, ‘pear’, ‘peach’, ‘orange’, ‘lemon’] )

‘lemon’

洗牌:

import random

items = [1, 2, 3, 4, 5, 6]

random.shuffle(items)

items

[3, 2, 5, 6, 4, 1]

python中閉包必須滿足三大特點 :1.閉包函數必須有内嵌函數2.内嵌函數需要引用該嵌套函數上一級namespace中的變量3.閉包函數必須傳回内嵌函數

python 作用域,continue和break的差別,深拷貝和淺拷貝,