舉例
def underscore_to_camelcase(s):
def camelcase():
yield str.lower
while True:
yield str.capitalize
return ''.join(f(sub) for sub, f in zip(s.split('_'), camelcase()))
拆解
from collections.abc import Iterator
def underscore_to_camelcase(s):
def camelcase(): # 生成器函數
yield str.lower
while True:
yield str.capitalize
generator_functions_call_result = camelcase()
print(type(generator_functions_call_result)) # <class 'generator'>
zipped = zip(s.split('_'), generator_functions_call_result)
print(isinstance(zipped, Iterator)) # True, 返回的是迭代器對象, 下面f in zipped是最好的證明
result = (f(sub) for sub, f in zipped) # 生成器表達式, f爲高階函數
print(type(result)) # <class 'generator'>
return ''.join(result)
print(underscore_to_camelcase("where_are_you"))
- camelcase是生成器函數,返回str.lower, str.capitalize, str.capitalize ...
- camelcase()是返回了一個生成器(是迭代器的一種特殊類型)
- zip() 函數用於將可迭代的對象作爲參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的(迭代器)對象, 是惰性的(python2中返回的是List對象)
- 列表推導式 vs 生成器表達式: 前者是[]後者是()
這樣拆分以後就沒有那麼magic了.