當前位置:首頁 » 編程語言 » pythonguid生成

pythonguid生成

發布時間: 2022-11-28 14:58:06

python的uuid

uuid是128位的全局唯一標識符(univeral unique identifier),通常用32位的一個字元串的形式來表現。有時也稱guid(global unique identifier)。python中自帶了uuid模塊來進行uuid的生成和管理工作。(具體從哪個版本開始有的不清楚。。)

python中的uuid模塊基於信息如MAC地址、時間戳、命名空間、隨機數、偽隨機數來uuid。具體方法有如下幾個:

uuid.uuid1()基於MAC地址,時間戳,隨機數來生成唯一的uuid,可以保證全球范圍內的唯一性。

uuid.uuid2()演算法與uuid1相同,不同的是把時間戳的前4位置換為POSIX的UID。不過需要注意的是python中沒有基於DCE的演算法,所以python的uuid模塊中沒有uuid2這個方法。

uuid.uuid3(namespace,name)通過計算一個命名空間和名字的md5散列值來給出一個uuid,所以可以保證命名空間中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了。【感謝評論區大佬指出】namespace並不是一個自己手動指定的字元串或其他量,而是在uuid模塊中本身給出的一些值。比如uuid.NAMESPACE_DNS,uuid.NAMESPACE_OID,uuid.NAMESPACE_OID這些值。這些值本身也是UUID對象,根據一定的規則計算得出。

uuid.uuid4()通過偽隨機數得到uuid,是有一定概率重復的

uuid.uuid5(namespace,name)和uuid3基本相同,只不過採用的散列演算法是sha1

一般而言,在對uuid的需求不是很復雜的時候,uuid1方法就已經夠用了,使用方法如下:
"""

import uuid

name = 'test_name'

namespace = uuid.NAMESPACE_URL

print uuid.uuid1()
print uuid.uuid3(namespace,name)
print uuid.uuid4()
print uuid.uuid5(namespace,name)
"""

② python生成器到底有什麼優點

1. 迭代器協議

由於生成器自動實現了迭代器協議,而迭代器協議對很多人來說,也是一個較為抽象的概念。所以,為了更好的理解生成器,我們需要簡單的回顧一下迭代器協議的概念。
迭代器協議是指:對象需要提供next方法,它要麼返回迭代中的下一項,要麼就引起一個StopIteration異常,以終止迭代

可迭代對象就是:實現了迭代器協議的對象

協議是一種約定,可迭代對象實現迭代器協議,Python的內置工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象。

舉個例子:在所有語言中,我們都可以使用for循環來遍歷數組,Python的list底層實現是一個數組,所以,我們可以使用for循環來遍歷list。如下所示:
>>> for n in [1, 2, 3, 4]:
... print n

但是,對Python稍微熟悉一點的朋友應該知道,Python的for循環不但可以用來遍歷list,還可以用來遍歷文件對象,如下所示:
>>> with open(『/etc/passwd』) as f: # 文件對象提供迭代器協議
... for line in f: # for循環使用迭代器協議訪問文件
... print line
...

為什麼在Python中,文件還可以使用for循環進行遍歷呢?這是因為,在Python中,文件對象實現了迭代器協議,for循環並不知道它遍歷的是一個文件對象,它只管使用迭代器協議訪問對象即可。正是由於Python的文件對象實現了迭代器協議,我們才得以使用如此方便的方式訪問文件,如下所示:
>>> f = open('/etc/passwd')
>>> dir(f)
['__class__', '__enter__', '__exit__', '__iter__', '__new__', 'writelines', '...'

2. 生成器

Python使用生成器對延遲操作提供了支持。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。這也是生成器的主要好處。

Python有兩種不同的方式提供生成器:
生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

2.1 生成器函數

我們來看一個例子,使用生成器返回自然數的平方(注意返回的是多個值):
def gensquares(N):
for i in range(N):
yield i ** 2

for item in gensquares(5):
print item,

使用普通函數:
def gensquares(N):
res = []
for i in range(N):
res.append(i*i)
return res

for item in gensquares(5):
print item,

可以看到,使用生成器函數代碼量更少。

2.2 生成器表達式

使用列表推導,將會一次產生所有結果:
>>> squares = [x**2 for x in range(5)]
>>> squares
[0, 1, 4, 9, 16]

將列表推導的中括弧,替換成圓括弧,就是一個生成器表達式:
>>> squares = (x**2 for x in range(5))
>>> squares
<generator object at 0x00B2EC88>
>>> next(squares)
0
>>> next(squares)
1
>>> next(squares)
4
>>> list(squares)
[9, 16]

Python不但使用迭代器協議,讓for循環變得更加通用。大部分內置函數,也是使用迭代器協議訪問對象的。例如, sum函數是Python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議,所以,我們可以直接這樣計算一系列值的和:
>>> sum(x ** 2 for x in xrange(4))

而不用多此一舉的先構造一個列表:
>>> sum([x ** 2 for x in xrange(4)])

2.3 再看生成器

前面已經對生成器有了感性的認識,我們以生成器函數為例,再來深入探討一下Python的生成器:
語法上和函數類似:生成器函數和常規函數幾乎是一樣的。它們都是使用def語句進行定義,差別在於,生成器使用yield語句返回一個值,而常規函數使用return語句返回一個值
自動實現迭代器協議:對於生成器,Python會自動實現迭代器協議,以便應用到迭代背景中(如for循環,sum函數)。由於生成器自動實現了迭代器協議,所以,我們可以調用它的next方法,並且,在沒有值可以返回的時候,生成器自動產生StopIteration異常
狀態掛起:生成器使用yield語句返回一個值。yield語句掛起該生成器函數的狀態,保留足夠的信息,以便之後從它離開的地方繼續執行
3. 示例

我們再來看兩個生成器的例子,以便大家更好的理解生成器的作用。

首先,生成器的好處是延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大數據量處理,將會非常有用。

大家可以在自己電腦上試試下面兩個表達式,並且觀察內存佔用情況。對於前一個表達式,我在自己的電腦上進行測試,還沒有看到最終結果電腦就已經卡死,對於後一個表達式,幾乎沒有什麼內存佔用。
sum([i for i in xrange(10000000000)])
sum(i for i in xrange(10000000000))

除了延遲計算,生成器還能有效提高代碼可讀性。例如,現在有一個需求,求一段文字中,每個單詞出現的位置。

不使用生成器的情況:
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text, 1):
if letter == ' ':
result.append(index)
return result

使用生成器的情況:
def index_words(text):
if text:
yield 0
for index, letter in enumerate(text, 1):
if letter == ' ':
yield index

這里,至少有兩個充分的理由說明 ,使用生成器比不使用生成器代碼更加清晰:
使用生成器以後,代碼行數更少。大家要記住,如果想把代碼寫的Pythonic,在保證代碼可讀性的前提下,代碼行數越少越好
不使用生成器的時候,對於每次結果,我們首先看到的是result.append(index),其次,才是index。也就是說,我們每次看到的是一個列表的append操作,只是append的是我們想要的結果。使用生成器的時候,直接yield index,少了列表append操作的干擾,我們一眼就能夠看出,代碼是要返回index。
這個例子充分說明了,合理使用生成器,能夠有效提高代碼可讀性。只要大家完全接受了生成器的概念,理解了yield語句和return語句一樣,也是返回一個值。那麼,就能夠理解為什麼使用生成器比不使用生成器要好,能夠理解使用生成器真的可以讓代碼變得清晰易懂。

4. 使用生成器的注意事項

相信通過這篇文章,大家已經能夠理解生成器的作用和好處。但是,還沒有結束,使用生成器,也有一點注意事項。

我們直接來看例子,假設文件中保存了每個省份的人口總數,現在,需要求每個省份的人口佔全國總人口的比例。顯然,我們需要先求出全國的總人口,然後在遍歷每個省份的人口,用每個省的人口數除以總人口數,就得到了每個省份的人口佔全國人口的比例。

如下所示:
def get_province_population(filename):
with open(filename) as f:
for line in f:
yield int(line)

gen = get_province_population('data.txt')
all_population = sum(gen)
#print all_population
for population in gen:
print population / all_population

執行上面這段代碼,將不會有任何輸出,這是因為,生成器只能遍歷一次。在我們執行sum語句的時候,就遍歷了我們的生成器,當我們再次遍歷我們的生成器的時候,將不會有任何記錄。所以,上面的代碼不會有任何輸出。

③ python生成金字塔

人生苦短,我用python!
本文將介紹三種使用python實現生成金字塔的方法,文末歸納了知識點。

本方法使用print列印出每一個字元,通過for循環計算每一次需要輸出的空格和星號。
print語句中,end=''表示不換行。

本方法利用了一個有趣的規律:

在程序中表達為 m += pow(10,i) ,即 m = m + pow(10,i) ,例如:

通過運行我們發現輸出數字的時候,由於每行數字是一次性輸出,而非每個數字輸出一次,相比方法一效率有了提升。
pow(10,i) 表示 10 i 。

本方法在方法二的基礎上再次改進空格的輸出方式,print(b*a)語句中,a表示輸出的次數。

當我把層數n設置為100的時候,發生了壯觀的一幕,感興趣的朋友歡迎自己試試。

文中同時使用了 range 數列,range[10] 表示:0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 。

以下是 print() 方法的語法:

參數

pow() 方法返回 x y (x的y次方) 的值。語法為:

參考文獻:
[1] Python for 循環語句
[2] Python print() 函數
[3] Python pow() 函數
[4] Number Pyramid

④ python如何自動生成單個隨機字母(a-z)。

1:mport random
#導入random模塊 用於生產隨機數功能

2:a = random.randint(97, 122)
#利用random.randint()函數生成一個隨機整數a,使得97<=a<=122
#對應從「a」到「z」的ASCII碼

3:c = chr(a)
#將a表示的ASCII碼轉換為對應的字母,這里的c就是你要的隨機字母

4:print c
#將字母輸出,完成

⑤ Python3 生成一個隨即列表

Python 生成一個隨即列表

      -1.最原始的方法--循環

import random #隨機數的庫

l = [] # 先定義一個空列表

for i in range(1,100):

        x = random.randint(1,100) # 選取數字的范圍是1--100 ,且為int

        l.append(x)

print(l)

-2.

l = [random.randint(0,100000) for i in range(1000)]  #

print(l)

3.

l = [random.randrange(1000) for i in range(1000)]

print(l)

4.

#生成不可重復的隨機數。

l = random.sample([i for i in range(10000)],100)

print(l)

⑥ python 如何生成 2 1 4 3 6 5 8 7。。。的指定長度的序列

首先,找規律:

(2 1) (4 3) (6 5) (8 7) ..

發現是每個偶數i與i-1互換位置,或者說:奇數加1,偶數減1。如此一來可以用列表表達式生成(假設長度為n):

[i-1 if i % 2 == 0 else i+1 for i in range(1, n+1)]

⑦ python如何編譯生成二進制文件

1、可以
2、當你編輯運行py文件後,就會生成對應文件名的pyc文件。
3、pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,載入的速度有所提高,而且pyc是一種跨平台的位元組碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。pyc的內容,是跟python的版本相關的,不同版本編譯後的pyc文件是不同的。
總之,是可以的

⑧ 關於Python中的隨機數生成步驟和隨機數質量

Python生成隨機數和隨機數質量的方法,random.random()用於生成一個指定范圍內的隨機符點數,兩個參數其中一個是上限,一個是下限。如果a > b,則生成隨機數:

printrandom.uniform(10,20)
printrandom.uniform(20,10)
#----
#18.7356606526
#12.5798298022
random.randint

用於生成一個指定范圍內的整數。其中參數a是下限,參數b是上限,Python生成隨機數

printrandom.randint(12,20)#生成的隨機數n:12<=n<=20
printrandom.randint(20,20)#結果永遠是20
#printrandom.randint(20,10)#該語句是錯誤的。

random.randrange方法從指定范圍內,按指定基數遞增的集合中 ,下面對python生成隨機數的應用程序的部分介紹:

1.隨機整數:

>>>importrandom
>>>random.randint(0,99)
21

2.隨機選取0到100間的偶數:

>>>importrandom
>>>random.randrange(0,101,2)
42

3.隨機浮點數:

>>>importrandom
>>>random.random()
0.85415370477785668
>>>random.uniform(1,10)
5.4221167969800881

4.隨機字元:

>>>importrandom
>>>random.choice('abcdefg&#%^*f')
'd'

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

>>>importrandom
random.sample('abcdefghij',3)
['a','d','b']

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

>>>importrandom
>>>importstring
>>>string.join(random.sample(['a','b','c','d','e','f','g','h','i','j'],3)).r
eplace("","")
'fih'

⑨ python---隨機生成密碼

importrandom,string
n=int(input('請輸入生成隨機密碼的個數n='))#n=10
m=int(input("請輸入生成隨機密碼的長度m="))#m=8
chars=string.ascii_letters+string.digits#生成['a',...,'z','A',...,'Z','0',...'9']
new_chars=''.join(chars)
ll=new_chars.split()
num=0
whilenum<n:
random.shuffle(ll)
list1=ll[:m]
num+=1
print(''.join(list1))
else:
print('生成了%s個長度是%s的隨機密碼'%(n,m))

在python 3.5上運行,結果完全滿足題的要求,也用了我一個多小時時間。

⑩ 如何更好地理解Python迭代器和生成器

Python這門語言中,生成器毫無疑問是最有用的特性之一。與此同時,也是使用的最不廣泛的Python特
性之一。究其原因,主要是因為,在其他主流語言裡面沒有生成器的概念。正是由於生成器是一
個「新」的東西,所以,它一方面沒有引起廣大工程師的重視,另一方面,也增加了工程師的學習成本,
最終導致大家錯過了Python中如此有用的一個特性。
我的這篇文章,希望通過簡單易懂的方式,深入淺出地介紹Python的生成器,以改變「如此有用的特性卻
使用極不廣泛」的現象。本文的組織如下:在第1章,我們簡單地介紹了Python中的迭代器協議;在本文
第2章,將會詳細介紹生成器的概念和語法;在第3章,將會給出一個有用的例子,說明使用生成器的好
處;在本文最後,簡單的討論了使用生成器的注意事項。
1. 迭代器協議
由於生成器自動實現了迭代器協議,而迭代器協議對很多人來說,也是一個較為抽象的概念。所以,為了
更好的理解生成器,我們需要簡單的回顧一下迭代器協議的概念。
1. 迭代器協議是指:對象需要提供next方法,它要麼返回迭代中的下一項,要麼就引起一個
StopIteration異常,以終止迭代
2. 可迭代對象就是:實現了迭代器協議的對象
3. 協議是一種約定,可迭代對象實現迭代器協議,Python的內置工具(如for循環,sum,min,max函
數等)使用迭代器協議訪問對象。
舉個例子:在所有語言中,我們都可以使用for循環來遍歷數組,Python的list底層實現是一個數組,所
以,我們可以使用for循環來遍歷list。如下所示:
>>> for n in [1, 2, 3, 4]:
... print n
但是,對Python稍微熟悉一點的朋友應該知道,Python的for循環不但可以用來遍歷list,還可以用來遍歷
文件對象,如下所示:
>>> with open(『/etc/passwd』) as f: # 文件對象提供迭代器協議
... for line in f: # for循環使用迭代器協議訪問文件
... print line
...
為什麼在Python中,文件還可以使用for循環進行遍歷呢?這是因為,在Python中,文件對象實現了迭代
器協議,for循環並不知道它遍歷的是一個文件對象,它只管使用迭代器協議訪問對象即可。正是由於
Python的文件對象實現了迭代器協議,我們才得以使用如此方便的方式訪問文件,如下所示:
>>> f = open('/etc/passwd')
>>> dir(f)
['__class__', '__enter__', '__exit__', '__iter__', '__new__', 'writelines', '...'
2. 生成器
Python使用生成器對延遲操作提供了支持。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產
生結果。這也是生成器的主要好處。
Python有兩種不同的方式提供生成器:
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 2/5
1. 生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一
個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
2. 生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個
結果列表
2.1 生成器函數
我們來看一個例子,使用生成器返回自然數的平方(注意返回的是多個值):
def gensquares(N):
for i in range(N):
yield i ** 2
for item in gensquares(5):
print item,
使用普通函數:
def gensquares(N):
res = []
for i in range(N):
res.append(i*i)
return res
for item in gensquares(5):
print item,
可以看到,使用生成器函數代碼量更少。
2.2 生成器表達式
使用列表推導,將會一次產生所有結果:
>>> squares = [x**2 for x in range(5)]
>>> squares
[0, 1, 4, 9, 16]
將列表推導的中括弧,替換成圓括弧,就是一個生成器表達式:
>>> squares = (x**2 for x in range(5))
>>> squares>>> next(squares)
0
>>> next(squares)
1
>>> next(squares)
4
>>> list(squares)
[9, 16]
Python不但使用迭代器協議,讓for循環變得更加通用。大部分內置函數,也是使用迭代器協議訪問對象
的。例如, sum函數是Python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 3/5
議,所以,我們可以直接這樣計算一系列值的和:
>>> sum(x ** 2 for x in xrange(4))
而不用多此一舉的先構造一個列表:
>>> sum([x ** 2 for x in xrange(4)])
2.3 再看生成器
前面已經對生成器有了感性的認識,我們以生成器函數為例,再來深入探討一下Python的生成器:
1. 語法上和函數類似:生成器函數和常規函數幾乎是一樣的。它們都是使用def語句進行定義,差別在
於,生成器使用yield語句返回一個值,而常規函數使用return語句返回一個值
2. 自動實現迭代器協議:對於生成器,Python會自動實現迭代器協議,以便應用到迭代背景中(如for
循環,sum函數)。由於生成器自動實現了迭代器協議,所以,我們可以調用它的next方法,並且,
在沒有值可以返回的時候,生成器自動產生StopIteration異常
3. 狀態掛起:生成器使用yield語句返回一個值。yield語句掛起該生成器函數的狀態,保留足夠的信息,
以便之後從它離開的地方繼續執行
3. 示例
我們再來看兩個生成器的例子,以便大家更好的理解生成器的作用。
首先,生成器的好處是延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大
數據量處理,將會非常有用。
大家可以在自己電腦上試試下面兩個表達式,並且觀察內存佔用情況。對於前一個表達式,我在自己的電
腦上進行測試,還沒有看到最終結果電腦就已經卡死,對於後一個表達式,幾乎沒有什麼內存佔用。
sum([i for i in xrange(10000000000)])
sum(i for i in xrange(10000000000))
除了延遲計算,生成器還能有效提高代碼可讀性。例如,現在有一個需求,求一段文字中,每個單詞出現
的位置。
不使用生成器的情況:
def index_words(text):
result = []
if text:
result.append(0)
for index, letter in enumerate(text, 1):
if letter == ' ':
result.append(index)
return result
使用生成器的情況:
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 4/5
def index_words(text):
if text:
yield 0
for index, letter in enumerate(text, 1):
if letter == ' ':
yield index
這里,至少有兩個充分的理由說明 ,使用生成器比不使用生成器代碼更加清晰:
1. 使用生成器以後,代碼行數更少。大家要記住,如果想把代碼寫的Pythonic,在保證代碼可讀性的前
提下,代碼行數越少越好
2. 不使用生成器的時候,對於每次結果,我們首先看到的是result.append(index),其次,才是index。
也就是說,我們每次看到的是一個列表的append操作,只是append的是我們想要的結果。使用生成
器的時候,直接yield index,少了列表append操作的干擾,我們一眼就能夠看出,代碼是要返回
index。
這個例子充分說明了,合理使用生成器,能夠有效提高代碼可讀性。只要大家完全接受了生成器的概念,
理解了yield語句和return語句一樣,也是返回一個值。那麼,就能夠理解為什麼使用生成器比不使用生成
器要好,能夠理解使用生成器真的可以讓代碼變得清晰易懂。
4. 使用生成器的注意事項
相信通過這篇文章,大家已經能夠理解生成器的作用和好處。但是,還沒有結束,使用生成器,也有一點
注意事項。
我們直接來看例子,假設文件中保存了每個省份的人口總數,現在,需要求每個省份的人口佔全國總人口
的比例。顯然,我們需要先求出全國的總人口,然後在遍歷每個省份的人口,用每個省的人口數除以總人
口數,就得到了每個省份的人口佔全國人口的比例。
如下所示:
def get_province_population(filename):
with open(filename) as f:
for line in f:
yield int(line)
gen = get_province_population('data.txt')
all_population = sum(gen)
#print all_population
for population in gen:
print population / all_population
執行上面這段代碼,將不會有任何輸出,這是因為,生成器只能遍歷一次。在我們執行sum語句的時候,
就遍歷了我們的生成器,當我們再次遍歷我們的生成器的時候,將不會有任何記錄。所以,上面的代碼不
會有任何輸出。
因此,生成器的唯一注意事項就是:生成器只能遍歷一次。
5. 總結
2017/11/6 如何更好地理解Python迭代器和生成器? - 知乎
https://www.hu.com/question/20829330 5/5
本文深入淺出地介紹了Python中,一個容易被大家忽略的重要特性,即Python的生成器。為了講解生成
器,本文先介紹了迭代器協議,然後介紹了生成器函數和生成器表達式,並通過示例演示了生成器的優點
和注意事項。在實際工作中,充分利用Python生成器,不但能夠減少內存使用,還能夠提高代碼可讀性。
掌握生成器也是Python高手的標配。希望本文能夠幫助大家理解Python的生成器

熱點內容
阿里雲esc伺服器系統 發布:2025-01-18 09:49:16 瀏覽:789
你們家的無線網密碼是多少 發布:2025-01-18 09:47:50 瀏覽:729
renderscriptandroid 發布:2025-01-18 09:32:18 瀏覽:992
安卓手機如何拍游戲素材 發布:2025-01-18 09:30:59 瀏覽:347
廣州日立壓縮機有限公司 發布:2025-01-18 09:15:08 瀏覽:623
伺服器兩條寬頻如何疊加網速 發布:2025-01-18 08:52:17 瀏覽:730
oracle存儲過程集合 發布:2025-01-18 08:42:39 瀏覽:884
洋蔥數學緩存 發布:2025-01-18 08:38:36 瀏覽:918
電影的文件夾都是 發布:2025-01-18 08:21:49 瀏覽:835
post提交php 發布:2025-01-18 08:21:42 瀏覽:460