Python學習記錄2

  • map函數(shù),批量計算數(shù)據(jù)


    Paste_Image.png
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

Python中轉變大小寫的直接函數(shù)有以下方法:
upper()——所有字母大寫
lower()——所有字母小寫
capitalize()——首字母大寫,其他字母小寫
title()——所有單詞首字母大寫,其他小寫

def normalize(name):
    return str.capitalize(name)

L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
  • reduce函數(shù),計算結果不斷迭代

  • filter 過濾函數(shù)

注意到filter()函數(shù)返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函數(shù)獲得所有結果并返回list。

def NumIsOdd(Num):
    return Num%2==1
# list后面的括號是類型轉化用的
print(list(filter(NumIsOdd,[1,2,3,4,5])))
  • 打印素數(shù)

計算素數(shù)的一個方法是埃氏篩法,它的算法理解起來非常簡單:
首先,列出從2開始的所有自然數(shù),構造一個序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...取序列的第一個數(shù)2,它一定是素數(shù),然后用2把序列的2
的倍數(shù)篩掉:3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第一個數(shù)3,它一定是素數(shù),然后用3把序列的3的倍數(shù)篩掉:5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...取新序列的第一個數(shù)5,然后用5把序列的5的倍數(shù)篩掉:7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...不斷篩下去,就可以得到所有的素數(shù)。

# 生成器
def _odd_iter():
    n=1
    while True:
        n = n + 2
        yield n

# 刷選函數(shù)
def _not_divisible(n):
    return lambda x : x % n > 0

# 定義一個生成器,不斷地返回下一個素數(shù)
def primes():
    yield 2
    it = _odd_iter()  # 初始化奇數(shù)序列
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible(n),it)   # 構造新序列


# 打印1000以內(nèi)的素數(shù):
for n in primes():
    if n < 1000:
        print(n)
    else:
        break
  • 回數(shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321,909。請利用filter()濾掉非回數(shù):
def is_palindrome(n):
    return str(n)==str(n)[::-1]

output = filter(is_palindrome, range(1, 1000))
print(list(output))
  • 為什么以下可以刪除空字符?
    strip函數(shù)會去掉字符串頭尾指定的字符,默認為空格,返回的是生成的新字符串;若下面的字符中是空字符,那么去掉后就是空了,and之后就為False。
def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
# 結果: ['A', 'B', 'C']
  • sorted函數(shù)
    假設我們用一組tuple表示學生名字和成績,對齊用成績進行排序
def by_name(t):
    return t[1]

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
L2 = sorted(L, key=by_name)
print(L2)
def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def now():
    print('2015-3-25')

返回

>>> now()
call now():
2015-3-25

調(diào)用now的時候,實際上是調(diào)用log,然后以now作為參數(shù)。
調(diào)用log后,看到只定義了并返回了函數(shù)wrapper,就調(diào)用了wrapper,wrapper第一句打印函數(shù)的名字,還是now,接下來,wrapper返回func的調(diào)用,也就是now真正執(zhí)行了。

如果decorator本身需要傳入?yún)?shù),那就需要編寫一個返回decorator的高階函數(shù),寫出來會更復雜。比如,要自定義log的文本:

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

這個3層嵌套的decorator用法如下:

@log('execute')
def now():
    print('2015-3-25')

執(zhí)行結果如下:

>>> now()
execute now():
2015-3-25

調(diào)用now的時候,實際上執(zhí)行函數(shù)log,返回decorator的執(zhí)行,返回wrapper的執(zhí)行,wrapper執(zhí)行就是結果了。

  • @property,將設置屬性變得更加簡單,這里實際上是一個修飾器,跟修飾器的代碼比較下。

class Screen(object):

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, val):
        self._width = val

    @property
    def height(self):
        return self._height


# test:
s = Screen()
s.width = 1024
#can't allowed!!
#  s.height = 768

print(s.width, s.height)
  • Python內(nèi)置的logging模塊可以非常容易地記錄錯誤信息:
# err_logging.py

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        logging.exception(e)

main()
print('END')
  • if name == 'main':的作用是什么?
    運行第一個模塊的時候,模塊內(nèi)建的變量name是‘main’,而其他次序運行的name就是模塊的名字,因此這個判斷直接的作用就是判斷模塊是不是首先被執(zhí)行,或者是被首先執(zhí)行的模塊import的。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 教程總綱:http://www.runoob.com/python/python-tutorial.html 進階...
    健康哥哥閱讀 2,191評論 1 3
  • 函數(shù)式編程就是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此,任意一個函數(shù),只要輸入是確...
    齊天大圣李圣杰閱讀 1,638評論 0 2
  • 要點: 函數(shù)式編程:注意不是“函數(shù)編程”,多了一個“式” 模塊:如何使用模塊 面向對象編程:面向對象的概念、屬性、...
    victorsungo閱讀 1,697評論 0 6
  • 問題描述 You are given two linked lists representing two non-...
    hitsunbo閱讀 591評論 0 0
  • 旭怡之戀 黃旭輝一個妖異的男子,自稱邪帝在一場舞會中找到了屬于自己的真愛…… “怡,今晚...
    洛水天蝎閱讀 534評論 0 0

友情鏈接更多精彩內(nèi)容