程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL復制失足 Last_SQL_Errno:1146的處理辦法

MySQL復制失足 Last_SQL_Errno:1146的處理辦法

編輯:MySQL綜合教程

MySQL復制失足 Last_SQL_Errno:1146的處理辦法。本站提示廣大學習愛好者:(MySQL復制失足 Last_SQL_Errno:1146的處理辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL復制失足 Last_SQL_Errno:1146的處理辦法正文


4. 生成器(generator)

4.1. 生成器簡介

起首請確信,生成器就是一種迭代器。生成器具有next辦法而且行動與迭代器完整雷同,這意味著生成器也能夠用於Python的for輪回中。別的,關於生成器的特別語法支撐使得編寫一個生成器比自界說一個慣例的迭代器要簡略很多,所以生成器也是最經常使用到的特征之一。

從Python 2.5開端,[PEP 342:經由過程加強生成器完成協同法式]的完成為生成器參加了更多的特征,這意味著生成器還可以完成更多的任務。這部門我們會在稍後的部門引見。

4.2. 生成器函數

4.2.1. 應用生成器函數界說生成器

若何獲得一個生成器?起首來看一小段代碼:

>>> def get_0_1_2():
...   yield 0
...   yield 1
...   yield 2
...
>>> get_0_1_2
<function get_0_1_2 at 0x00B2CB70>

我們界說了一個函數get_0_1_2,而且可以檢查到這確切是函數類型。但與普通的函數分歧的是,get_0_1_2的函數體內應用了症結字yield,這使得get_0_1_2成了一個生成器函數。生成器函數的特征以下:

1.挪用生成器函數將前往一個生成器;

>>> generator = get_0_1_2()
>>> generator
<generator object get_0_1_2 at 0x00B1C7D8>

2.第一次挪用生成器的next辦法時,生成器才開端履行生成器函數(而不是構建生成器時),直到碰到yield時暫停履行(掛起),而且yield的參數將作為此次next辦法的前往值;

>>> generator.next()
0

3.以後每次挪用生成器的next辦法,生成器將從前次暫停履行的地位恢復履行生成器函數,直到再次碰到yield時暫停,而且異樣的,yield的參數將作為next辦法的前往值;

>>> generator.next()
1
>>> generator.next()
2

4.假如當挪用next辦法時生成器函數停止(碰到空的return語句或是達到函數體末尾),則此次next辦法的挪用將拋出StopIteration異常(即for輪回的終止前提);

>>> generator.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

5.生成器函數在每次暫停履行時,函數體內的一切變量都將被封存(freeze)在生成器中,並將在恢復履行時復原,而且相似於閉包,即便是統一個生成器函數前往的生成器,封存的變量也是相互自力的。
我們的小例子中並沒有效到變量,所以這裡別的界說一個生成器來展現這個特色:

>>> def fibonacci():
...   a = b = 1
...   yield a
...   yield b
...   while True:
...     a, b = b, a+b
...     yield b
...
>>> for num in fibonacci():
...   if num > 100: break
...   print num,
...
1 1 2 3 5 8 13 21 34 55 89

看到while True可別太受驚,由於生成器可以掛起,所所以延遲盤算的,無窮輪回並沒有關系。這個例子中我們界說了一個生成器用於獲得斐波那契數列。

4.2.2. 生成器函數的FAQ
接上去我們來評論辯論一些關於生成器的成心思的話題。

1.你的例子裡生成器函數都沒有參數,那末生成器函數可以帶參數嗎?

固然可以啊親,並且它支撐函數的一切參數情勢。要曉得生成器函數也是函數的一種:)

>>> def counter(start=0):
...   while True:
...     yield start
...     start += 1
...

這是一個從指定命開端的計數器。

2.既然生成器函數也是函數,那末它可使用return輸入前往值嗎?

不可的親,是如許的,生成器函數曾經有默許的前往值——生成器了,你不克不及再別的給一個前往值;對,即便是return None也不可。然則它可使用空的return語句停止。假如你保持要為它指定前往值,那末Python將在界說的地位贈予一個語法毛病異常,就像如許:

>>> def i_wanna_return():
...   yield None
...   return None
...
  File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator

3.好吧,那人家須要確保釋放資本,須要在try...finally中yield,這會是神馬情形?(我就是想玩你)我在finally中還yield了一次!
Python會在真正分開try...finally時再履行finally中的代碼,而這裡遺憾地告知你,暫停不算哦!所以終局你也能猜到吧!

>>> def play_u():
...   try:
...     yield 1
...     yield 2
...     yield 3
...   finally:
...     yield 0
...
>>> for val in play_u(): print val,
...
1 2 3 0

*這與return的情形分歧。return是真實的分開代碼塊,所以會在return時連忙履行finally子句。
*別的,“在帶有finally子句的try塊中yield”界說在PEP 342中,這意味著只要Python 2.5以上版本才支撐這個語法,在Python 2.4以下版本中會獲得語法毛病異常。

4.假如我須要在生成器的迭代進程中接入另外一個生成器的迭代怎樣辦?寫成上面如許好傻晴天真。。

>>> def sub_generator():
...   yield 1
...   yield 2
...   for val in counter(10): yield val
...

這類情形的語法改良曾經被界說在[PEP 380:拜托至子生成器的語法]中,聽說會在Python 3.3中完成,屆時也能夠回饋到2.x中。完成後,便可以這麼寫了:

>>> def sub_generator():
...   yield 1
...   yield 2
...   yield from counter(10)
  File "<stdin>", line 4
    yield from counter(10)
             ^
SyntaxError: invalid syntax

看到語法毛病木有?如今我們照樣無邪一點吧~

有更多成績?請答復此文:)

4.3. 協同法式(coroutine)

協同法式(協程)普通來講是指如許的函數:

1.彼其間有分歧的部分變量、指令指針,但仍同享全局變量;
2.可以便利地掛起、恢復,而且有多個進口點和出口點;
3.多個協同法式間表示為協作運轉,如A的運轉進程中須要B的成果能力持續履行。

協程的特色決議了統一時辰只能有一個協同法式正在運轉(疏忽多線程的情形)。得益於此,協程間可以直接傳遞對象而不須要斟酌資本鎖、或是直接叫醒其他協程而不須要自動休眠,就像是內置了鎖的線程。在相符協程特色的運用場景,應用協程無疑比應用線程要更便利。

從另外一方面說,協程沒法並發其實也將它的運用場景限制在了一個很狹小的規模,這個特色使得協程更多的被拿來與慣例函數停止比擬,而不是與線程。固然,線程比協程龐雜很多,功效也更壯大,所以我建議年夜家緊緊地控制線程便可:Python線程指南

這一節裡我也就不羅列關於協程的例子了,以下引見的辦法懂得便可。

Python 2.5對生成器的加強完成了協程的其他特色,在這個版本中,生成器參加了以下辦法:

1.send(value):

send是除next外另外一個恢回生成器的辦法。Python 2.5中,yield語句釀成了yield表達式,這意味著yield如今可以有一個值,而這個值就是在生成器的send辦法被挪用從而恢復履行時,挪用send辦法的參數。

>>> def repeater():
...   n = 0
...   while True:
...     n = (yield n)
...
>>> r = repeater()
>>> r.next()
0
>>> r.send(10)
10

*挪用send傳入非None值前,生成器必需處於掛起狀況,不然將拋出異常。不外,未啟動的生成器仍可使用None作為參數挪用send。
*假如應用next恢回生成器,yield表達式的值將是None。
2.close():
這個辦法用於封閉生成器。對封閉的生成器後再次挪用next或send將拋出StopIteration異常。
3.throw(type, value=None, traceback=None):
這個辦法用於在生成器外部(生成器確當前掛起處,或未啟動時在界說處)拋出一個異常。
*別為沒見到協程的例子遺憾,協程最多見的用途其實就是生成器。

4.4. 一個風趣的庫:pipe
這一節裡我要向諸位扼要引見pipe。pipe其實不是Python內置的庫,假如你裝置了easy_install,直接可以裝置它,不然你須要本身下載它:http://pypi.python.org/pypi/pipe

之所以要引見這個庫,是由於它向我們展現了一種很有新意的應用迭代器和生成器的方法:流。pipe將可迭代的數據算作是流,相似於linux,pipe應用'|'傳遞數據流,而且界說了一系列的“流處置”函數用於接收並處置數據流,並終究再次輸入數據流或許是將數據流歸結獲得一個成果。我們來看一些例子。

第一個,異常簡略的,應用add乞降:


>>> from pipe import *
>>> range(5) | add
10

求偶數和須要應用到where,感化相似於內建函數filter,過濾出相符前提的元素:

>>> range(5) | where(lambda x: x % 2 == 0) | add
6

還記得我們界說的斐波那契數列生成器嗎?求出數列中一切小於10000的偶數和須要用到take_while,與itertools的同名函數有相似的功效,截取元素直到前提不成立:

>>> fib = fibonacci
>>> fib() | where(lambda x: x % 2 == 0)\
...       | take_while(lambda x: x < 10000)\
...       | add
3382

須要對元素運用某個函數可使用select,感化相似於內建函數map;須要獲得一個列表,可使用as_list:


>>> fib() | select(lambda x: x ** 2) | take_while(lambda x: x < 100) | as_list
[1, 1, 4, 9, 25, 64]

pipe中還包含了更多的流處置函數。你乃至可以本身界說流處置函數,只須要界說一個生成器函數並加上潤飾器Pipe。以下界說了一個獲得元素直到索引不相符前提的流處置函數:


>>> @Pipe
... def take_while_idx(iterable, predicate):
...   for idx, x in enumerate(iterable):
...     if predicate(idx): yield x
...     else: return
...

應用這個流處置函數獲得fib的前10個數字:


>>> fib() | take_while_idx(lambda x: x < 10) | as_list
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

更多的函數就不在這裡引見了,你可以檢查pipe的源文件,總共600行不到的文件個中有300行是文檔,文檔中包括了年夜量的示例。

pipe完成起來異常簡略,應用Pipe裝潢器,將通俗的生成器函數(或許前往迭代器的函數)署理在一個完成了__ror__辦法的通俗類實例上便可,然則這類思緒真的很風趣。

函數式編程指南全文到這裡就全體停止了,願望這一系列文章能給你帶來贊助。願望年夜家都能看到一些構造式編程以外的編程方法,而且可以或許闇練地在適當的處所應用 :)

今天我會整頓一個目次放下去便利檢查,而且列出一些供參考的文章。遺憾的是這些文章簡直都是英文的,請盡力進修英語吧 - -#

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved