Python 中的 for 語句和 C 或 Pascal 中的略有不同。通常的循環(huán)可能會依據(jù)一個等差數(shù)值步進過程(如 Pascal),或由用戶來定義迭代步驟和中止條件(如 C ),Python 的 for 語句依據(jù)任意序列(鏈表或字符串)中的子項,按它們在序列中的順序來進行迭代。例如(沒有暗指):
10年積累的做網站、成都網站設計經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有寧武免費網站建設讓你可以放心的選擇與我們合作。
# Measure some strings:
... words = ['cat', 'window', 'defenestrate']
for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 12
在迭代過程中修改迭代序列不安全(只有在使用鏈表這樣的可變序列時才會有這樣的情況)。如果你想要修改你迭代的序列(例如,復制選擇項),你可以迭代它的復本。使用切割標識就可以很方便的做到這一點:
i等于9因為閉包,lambda生成之后i引用的就是for循環(huán)中的i
建議你看一下python的列表生成器,
f = [(lambda n : i + n) for i in range(10)] 等同于
f=[]
for i in range(10)
f.append(lambda n : i + n)
下面是相關內容
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創(chuàng)建list的生成式。
舉個例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):
range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循環(huán):
L = [] for x in range(1, 11):... ?? L.append(x * x)
... L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循環(huán)太繁瑣,而列表生成式則可以用一行語句代替循環(huán)生成上面的list:
[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時,把要生成的元素x * x放到前面,后面跟for循環(huán),就可以把list創(chuàng)建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
for循環(huán)后面還可以加上if判斷,這樣我們就可以篩選出僅偶數(shù)的平方:
[x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
還可以使用兩層循環(huán),可以生成全排列:
[m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
三層和三層以上的循環(huán)就很少用到了。
運用列表生成式,可以寫出非常簡潔的代碼。例如,列出當前目錄下的所有文件和目錄名,可以通過一行代碼實現(xiàn):
import os # 導入os模塊,模塊的概念后面講到 [d for d in os.listdir('.')] # os.listdir可以列出文件和目錄['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']
for循環(huán)其實可以同時使用兩個甚至多個變量,比如dict的iteritems()可以同時迭代key和value:
d = {'x': 'A', 'y': 'B', 'z': 'C' } for k, v in d.iteritems():... ?? ?print k, '=', v... y = B
x = A
z = C
因此,列表生成式也可以使用兩個變量來生成list:
d = {'x': 'A', 'y': 'B', 'z': 'C' } [k + '=' + v for k, v in d.iteritems()]
['y=B', 'x=A', 'z=C']
最后把一個list中所有的字符串變成小寫:
L = ['Hello', 'World', 'IBM', 'Apple'] [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
小結
運用列表生成式,可以快速生成list,可以通過一個list推導出另一個list,而代碼卻十分簡潔。
思考:如果list中既包含字符串,又包含整數(shù),由于非字符串類型沒有l(wèi)ower()方法,所以列表生成式會報錯:
L = ['Hello', 'World', 18, 'Apple', None]
[s.lower() for s in L]
Traceback (most recent call last):
File "stdin", line 1, in moduleAttributeError: 'int' object has no attribute 'lower'
使用內建的isinstance函數(shù)可以判斷一個變量是不是字符串:
x = 'abc' y = 123 isinstance(x, str)True isinstance(y, str)False
請修改列表生成式,通過添加if語句保證列表生成式能正確地執(zhí)行。
聽起來你之前應該有學習一些靜態(tài)編程語言,比如C, 所有會有些先入為主的理解。
為什么“i”好像可以不用定義就能使用?這是語法規(guī)定 沒什么好說。
“i”的值從0開始?因為rang(5)會生成了一個類似[0,1,2,3,4]的序列,而for語句會迭代這個序列并把它的值依次賦給變量“i”,第一次賦值的時候就是0。
至于“i”為什么是inti型,Python是動態(tài)類型語言并且它足夠聰明 會自動推斷合適的數(shù)據(jù)類型給變量,不用我們指定數(shù)據(jù)類型。
關于for語句和range()函數(shù)的解釋
Python 的?for?語句與 C 或 Pascal 中的不同。Python 的?for?語句不迭代算術遞增數(shù)值(如 Pascal),或是給予用戶定義迭代步驟和暫停條件的能力(如 C),而是迭代列表或字符串等任意序列,元素的迭代順序與在序列中出現(xiàn)的順序一致。
內置函數(shù)?range() 可以生成算術級數(shù),生成的序列不包含給定的終止數(shù)值:
range(start,?stop[,?step])
start: 計數(shù)從 start 開始。默認是從 0 開始。例如range(5)等價于range(0, 5);
stop: 計數(shù)到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
step:步長,默認為1。例如:range(0, 5) 等價于 range(0, 5, 1)
for ... in ...
//?for?...?in?字符串
for?i?in?'abc':
print(i)
'''
a
b
c
'''
//?for?...?in?數(shù)組
for?i?in?['a',?'b',?'c']:
print(i)
'''
a
b
c
'''
//?for?...?in?元組
for?i?in?('a',?'b',?'c'):
print(i)
'''
a
b
c
'''
//?for?...?in?字典(得到的是字典的key)
for?k?in?{'學號':30,'姓名':'小明'}:
print(k)
'''
姓名
學號
'''
//?for?...?in?字典.items()(得到的是字典的key,?value)
for?k,?v?in?{'學號':30,'姓名':'小明'}.items():
print(k,?v)
'''
姓名?小明
學號?30
'''
for ... in range(...)
//?for?...?in?range(num)
for?i?in?range(3):
print(i)
'''
1
2
'''
//?for?...?in?range(num1,?num2)
for?i?in?range(1,?3):
print(i)
'''
1
2
'''
//?for?...?in?range(num1,?num2,?num3)
for?i?in?range(3,?1,?-1):
print(i)
'''
3
2
'''
for?i?in?range(1,?5,?2):
print(i)
'''????????
1
3
'''
倒敘
for?i?in?reversed([1,2,3,4]):
print(i)
’‘’
4
3
2
1
‘’‘
又想得到遍歷次數(shù),又想得到數(shù)組值
for i,e in enumerate(array):
for?i,e?in?enumerate(['21dw',?55,?22,?'rw']):
print(i,?e)
'''
0?21dw
1?55
2?22
3?rw
'''
列表生成式
[...for ... in array]]
print([x?*?x?for?x?in?[2,?34,?324,?43]])
'''
[4,?1156,?104976,?1849]
'''
//相當于
list?=?[]
for?x?in?[2,?34,?324,?43]:
list.append(x?*?x)
print(list)
python用for循環(huán)遍歷文件操作,代碼如下:
#!\urs\bin\env?python
#encoding:utf-8???????#設置編碼方式??
import?os
import?re
class?loop_file:
def?__init__(self,?root_dir,?short_exclude=[],?long_exclude=[],?file_extend=[]):
self.root_dir?=?root_dir
self.short_exclude?=?short_exclude
self.long_exclude?=?long_exclude
self.file_extend?=?file_extend
def?__del__(self):
pass
def?start(self,?func):
self.func?=?func
return?self.loop_file(self.root_dir)????
def?loop_file(self,?root_dir):
t_sum?=?[]
sub_gen?=?os.listdir(root_dir)
for?sub?in?sub_gen:
is_exclude?=?False
for?extends?in?self.short_exclude:??##在不檢查文件、目錄范圍中
if?extends?in?sub:??????????????##包含特定內容
is_exclude?=?True
break
if?re.search(extends,?sub):?????##匹配指定正則
is_exclude?=?True
break????????????????????
if?is_exclude:
continue????????????
abs_path?=?os.path.join(root_dir,?sub)
is_exclude?=?False
for?exclude?in?self.long_exclude:
if?exclude?==?abs_path[-len(exclude):]:
is_exclude?=?True
break
if?is_exclude:
continue
if?os.path.isdir(abs_path):
t_sum.extend(self.loop_file(abs_path))
elif?os.path.isfile(abs_path):????????????
if?not?"."?+?abs_path.rsplit(".",?1)[1]?in?self.file_extend:??##不在后綴名?檢查范圍中
continue
t_sum.append(self.func(abs_path))
return?t_sum????
if?'__main__'==__name__:
root_dir?=?r'D:\harness\newshoppingcart\testcase\promo\single_promo'
short_exclude?=?['.svn',?'.*_new.rb']?????###不包含檢查的短目錄、文件
long_exclude?=?[]?????????????????????????###不包含檢查的長目錄、文件
file_extend?=?['.rb']?????????????????????###包含檢查的文件類型
lf?=?loop_file(root_dir,?short_exclude,?long_exclude,?file_extend)
for?f?in?lf.start(lambda?f:?f):
print?f