最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Python3中初學(xué)者應(yīng)會的一些基本的提升效率的小技巧

 更新時間:2015年03月31日 11:19:51   作者:bugra  
這篇文章主要介紹了在Python3中的一些基本的小技巧,有利于剛剛上手Python的初學(xué)者提升開發(fā)效率,需要的朋友可以參考下

有時候我反問我自己,怎么不知道在Python 3中用更簡單的方式做“這樣”的事,當我尋求答案時,隨著時間的推移,我當然發(fā)現(xiàn)更簡潔、有效并且bug更少的代碼??偟膩碚f(不僅僅是這篇文章),“那些”事情總共數(shù)量是超過我想象的,但這里是第一批不明顯的特性,后來我尋求到了更有效的/簡單的/可維護的代碼。
字典

字典中的keys()和items()

你能在字典的keys和items中做很多有意思的操作,它們類似于集合(set):

 
aa = {‘mike': ‘male', ‘kathy': ‘female', ‘steve': ‘male', ‘hillary': ‘female'}
 
bb = {‘mike': ‘male', ‘ben': ‘male', ‘hillary': ‘female'}
 
aa.keys() & bb.keys() # {‘mike', ‘hillary'} # these are set-like
aa.keys() - bb.keys() # {‘kathy', ‘steve'}
# If you want to get the common key-value pairs in the two dictionaries
aa.items() & bb.items() # {(‘mike', ‘male'), (‘hillary', ‘female')}

太簡潔啦!

在字典中校驗一個key的存在

下面這段代碼你寫了多少遍了?

 
dictionary = {}
for k, v in ls:
  if not k in dictionary:
    dictionary[k] = []
  dictionary[k].append(v)

這段代碼其實沒有那么糟糕,但是為什么你一直都需要用if語句呢?

 
from collections import defaultdict
dictionary = defaultdict(list) # defaults to list
for k, v in ls:
  dictionary[k].append(v)

這樣就更清晰了,沒有一個多余而模糊的if語句。

用另一個字典來更新一個字典

 
from itertools import chain
a = {‘x': 1, ‘y':2, ‘z':3}
b = {‘y': 5, ‘s': 10, ‘x': 3, ‘z': 6}
 
# Update a with b
c = dict(chain(a.items(), b.items()))
c # {‘y': 5, ‘s': 10, ‘x': 3, ‘z': 6}

這樣看起來還不錯,但是不夠簡明??纯次覀兪欠衲茏龅酶茫?br />

 
c = a.copy()
c.update(b)

更清晰而且更有可讀性了!

從一個字典獲得最大值

如果你想獲取一個字典中的最大值,可能會像這樣直接:

 
aa = {k: sum(range(k)) for k in range(10)}
aa # {0: 0, 1: 0, 2: 1, 3: 3, 4: 6, 5: 10, 6: 15, 7: 21, 8: 28, 9: 36}
max(aa.values()) #36

這么做是有效的,但是如果你需要key,那么你就需要在value的基礎(chǔ)上再找到key。然而,我們可以用過zip來讓展現(xiàn)更扁平化,并返回一個如下這樣的key-value形式:

 
max(zip(aa.values(), aa.keys()))
# (36, 9) => value, key pair

同樣地,如果你想從最大到最小地去遍歷一個字典,你可以這么干:

 
sorted(zip(aa.values(), aa.keys()), reverse=True)
# [(36, 9), (28, 8), (21, 7), (15, 6), (10, 5), (6, 4), (3, 3), (1, 2), (0, 1), (0, 0)]

在一個list中打開任意數(shù)量的items

我們可以運用*的魔法,獲取任意的items放到list中:

 
def compute_average_salary(person_salary):
  person, *salary = person_salary
  return person, (sum(salary) / float(len(salary)))
 
person, average_salary = compute_average_salary([“mike”, 40000, 50000, 60000])
person # ‘mike'
average_salary # 50000.0

這不是那么有趣,但是如果我告訴你也可以像下面這樣呢:

 
def compute_average_salary(person_salary_age):
  person, *salary, age = person_salary_age
  return person, (sum(salary) / float(len(salary))), age
 
person, average_salary, age = compute_average_salary([“mike”, 40000, 50000, 60000, 42])
age # 42

看起來很簡潔嘛!

當你想到有一個字符串類型的key和一個list的value的字典,而不是遍歷一個字典,然后順序地處理value,你可以使用一個更扁平的展現(xiàn)(list中套list),像下面這樣:

 
# Instead of doing this
for k, v in dictionary.items():
  process(v)
 
# we are separating head and the rest, and process the values
# as a list similar to the above. head becomes the key value
for head, *rest in ls:
  process(rest)
 
# if not very clear, consider the following example
aa = {k: list(range(k)) for k in range(5)} # range returns an iterator
aa # {0: [], 1: [0], 2: [0, 1], 3: [0, 1, 2], 4: [0, 1, 2, 3]}
for k, v in aa.items():
  sum(v)
 
#0
#0
#1
#3
#6
 
# Instead
aa = [[ii] + list(range(jj)) for ii, jj in enumerate(range(5))]
for head, *rest in aa:
  print(sum(rest))
 
#0
#0
#1
#3
#6

你可以把list解壓成head,*rest,tail等等。

Collections用作計數(shù)器

Collections是我在python中最喜歡的庫之一,在python中,除了原始的默認的,如果你還需要其他的數(shù)據(jù)結(jié)構(gòu),你就應(yīng)該看看這個。

我日?;竟ぷ鞯囊徊糠志褪怯嬎愦罅慷植皇呛苤匾脑~??赡苡腥藭f,你可以把這些詞作為一個字典的key,他們分別的值作為value,在我沒有接觸到collections中的Counter時,我可能會同意你的做法(是的,做這么多介紹就是因為Counter)。

假設(shè)你讀的python語言的維基百科,轉(zhuǎn)化為一個字符串,放到一個list中(標記好順序):

 
import re
word_list = list(map(lambda k: k.lower().strip(), re.split(r'[;,:(.s)]s*', python_string)))
word_list[:10] # [‘python', ‘is', ‘a(chǎn)', ‘widely', ‘used', ‘general-purpose', ‘high-level', ‘programming', ‘language', ‘[17][18][19]']

到目前為止看起來都不錯,但是如果你想計算這個list中的單詞:

 
from collections import defaultdict # again, collections!
dictionary = defaultdict(int)
for word in word_list:
  dictionary[word] += 1

這個沒有那么糟糕,但是如果你有了Counter,你將會節(jié)約下你的時間做更有意義的事情。

 
from collections import Counter
counter = Counter(word_list)
# Getting the most common 10 words
counter.most_common(10)
[(‘the', 164), (‘a(chǎn)nd', 161), (‘a(chǎn)', 138), (‘python', 138),
(‘of', 131), (‘is', 102), (‘to', 91), (‘in', 88), (‘', 56)]
counter.keys()[:10] # just like a dictionary
[‘', ‘limited', ‘a(chǎn)ll', ‘code', ‘managed', ‘multi-paradigm',
‘exponentiation', ‘fromosing', ‘dynamic']

很簡潔吧,但是如果我們看看在Counter中包含的可用的方法:

 
dir(counter)
[‘__add__', ‘__and__', ‘__class__', ‘__cmp__', ‘__contains__', ‘__delattr__', ‘__delitem__', ‘__dict__',
‘__doc__', ‘__eq__', ‘__format__', ‘__ge__', ‘__getattribute__', ‘__getitem__', ‘__gt__', ‘__hash__',
‘__init__', ‘__iter__', ‘__le__', ‘__len__', ‘__lt__', ‘__missing__', ‘__module__', ‘__ne__', ‘__new__',
‘__or__', ‘__reduce__', ‘__reduce_ex__', ‘__repr__', ‘__setattr__', ‘__setitem__', ‘__sizeof__',
‘__str__', ‘__sub__', ‘__subclasshook__', ‘__weakref__', ‘clear', ‘copy', ‘elements', ‘fromkeys', ‘get',
‘has_key', ‘items', ‘iteritems', ‘iterkeys', ‘itervalues', ‘keys', ‘most_common', ‘pop', ‘popitem', ‘setdefault',
‘subtract', ‘update', ‘values', ‘viewitems', ‘viewkeys', ‘viewvalues']

你看到__add__和__sub__方法了嗎,是的,Counter支持加減運算。因此,如果你有很多文本想要去計算單詞,你不必需要Hadoop,你可以運用Counter(作為map)然后把它們加起來(相當于reduce)。這樣你就有構(gòu)建在Counter上的mapreduce了,你可能以后還會感謝我。

扁平嵌套lists

Collections也有_chain函數(shù),其可被用作扁平嵌套lists

 
from collections import chain
ls = [[kk] + list(range(kk)) for kk in range(5)]
flattened_list = list(collections._chain(*ls))

同時打開兩個文件

如果你在處理一個文件(比如一行一行地),而且要把這些處理好的行寫入到另一個文件中,你可能情不自禁地像下面這么去寫:

 
with open(input_file_path) as inputfile:
  with open(output_file_path, ‘w') as outputfile:
    for line in inputfile:
      outputfile.write(process(line))

除此之外,你可以在相同的一行里打開多個文件,就像下面這樣:

 
with open(input_file_path) as inputfile, open(output_file_path, ‘w') as outputfile:
  for line in inputfile:
    outputfile.write(process(line))

這樣就更簡潔啦!
從一堆數(shù)據(jù)中找到星期一

如果你有一個數(shù)據(jù)想去標準化(比如周一之前或是之后),你也許會像下面這樣:

 
import datetime
previous_monday = some_date - datetime.timedelta(days=some_date.weekday())
# Similarly, you could map to next monday as well
next_monday = some_date + date_time.timedelta(days=-some_date.weekday(), weeks=1)

這就是實現(xiàn)方式。
處理HTML

如果你出于興趣或是利益要爬一個站點,你可能會一直面臨著html標簽。為了去解析各種各樣的html標簽,你可以運用html.parer:
 

from html.parser import HTMLParser
 
class HTMLStrip(HTMLParser):
 
  def __init__(self):
    self.reset()
    self.ls = []
 
  def handle_data(self, d):
    self.ls.append(d)
 
  def get_data(self):
    return ‘'.join(self.ls)
 
  @staticmethod
  def strip(snippet):
    html_strip = HTMLStrip()
    html_strip.feed(snippet)
    clean_text = html_strip.get_data()
    return clean_text
 
snippet = HTMLStrip.strip(html_snippet)

如果你僅僅想避開html:
 

escaped_snippet = html.escape(html_snippet)
 
# Back to html snippets(this is new in Python 3.4)
html_snippet = html.unescape(escaped_snippet)
# and so forth ...

相關(guān)文章

  • Python PyCryptodome庫介紹與實例教程

    Python PyCryptodome庫介紹與實例教程

    PyCryptodome提供了豐富的加密功能,可以滿足多種安全需求,本文介紹了幾個常見的使用場景,包括對稱加密、非對稱加密、哈希函數(shù)和消息認證碼,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 編寫Python小程序來統(tǒng)計測試腳本的關(guān)鍵字

    編寫Python小程序來統(tǒng)計測試腳本的關(guān)鍵字

    這篇文章主要介紹了編寫Python小程序來統(tǒng)計測試腳本的關(guān)鍵字的方法,文中的實例不僅可以統(tǒng)計關(guān)鍵字數(shù)量,還可以按主關(guān)鍵字來歸類,需要的朋友可以參考下
    2016-03-03
  • Python設(shè)計模式之橋接模式原理與用法實例分析

    Python設(shè)計模式之橋接模式原理與用法實例分析

    這篇文章主要介紹了Python設(shè)計模式之橋接模式原理與用法,結(jié)合具體實例形式分析了Python橋接模式的相關(guān)概念、原理、定義及使用方法,需要的朋友可以參考下
    2019-01-01
  • Pycharm 常用插件推薦小結(jié)

    Pycharm 常用插件推薦小結(jié)

    本文主要介紹了Pycharm 常用插件推薦小結(jié),包含KeyPromoterX、ideaVim、Markdown、JupyterNotebook等PyCharm插件的功能和安裝方法,幫助提高編程效率和便捷性
    2024-11-11
  • Python制作進度條的四種方法總結(jié)

    Python制作進度條的四種方法總結(jié)

    如果你之前沒用過進度條,八成是覺得它會增加不必要的復(fù)雜性或者很難維護,其實不然。要加一個進度條其實只需要幾行代碼,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2022-11-11
  • Python編程之gui程序?qū)崿F(xiàn)簡單文件瀏覽器代碼

    Python編程之gui程序?qū)崿F(xiàn)簡單文件瀏覽器代碼

    這篇文章主要介紹了Python編程之gui程序?qū)崿F(xiàn)簡單文件瀏覽器代碼,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12
  • Python列表去重的4種核心方法與實戰(zhàn)指南詳解

    Python列表去重的4種核心方法與實戰(zhàn)指南詳解

    在Python開發(fā)中,處理列表數(shù)據(jù)時經(jīng)常需要去除重復(fù)元素,本文將詳細介紹4種最實用的列表去重方法,有需要的小伙伴可以根據(jù)自己的需要進行選擇
    2025-04-04
  • python數(shù)據(jù)分析之用sklearn預(yù)測糖尿病

    python數(shù)據(jù)分析之用sklearn預(yù)測糖尿病

    這篇文章主要介紹了python數(shù)據(jù)分析之用sklearn預(yù)測糖尿病,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python數(shù)據(jù)分析的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • python七種方法判斷字符串是否包含子串

    python七種方法判斷字符串是否包含子串

    這篇文章主要介紹了python七種方法判斷字符串是否包含子串,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-08-08
  • Pandas DataFrame操作數(shù)據(jù)增刪查改

    Pandas DataFrame操作數(shù)據(jù)增刪查改

    我們在用 pandas 處理數(shù)據(jù)的時候,經(jīng)常會遇到用其中一列數(shù)據(jù)替換另一列數(shù)據(jù)的場景。這一類的需求估計很多人都遇到,當然還有其它更復(fù)雜的。解決這類需求的辦法有很多,這里我們來推薦幾個,這篇文章主要介紹了Pandas DataFrame操作數(shù)據(jù)的增刪查改
    2022-10-10

最新評論

分宜县| 房山区| 壶关县| 龙南县| 建水县| 固镇县| 镇江市| 工布江达县| 安远县| 托克托县| 萨迦县| 通道| 内丘县| 资源县| 通山县| 二手房| 吴川市| 华蓥市| 襄樊市| 施秉县| 柳江县| 堆龙德庆县| 光泽县| 盐城市| 宣武区| 寻乌县| 天水市| 云南省| 平顺县| 恩施市| 南木林县| 江西省| 安国市| 龙岩市| 济宁市| 麻江县| 安宁市| 惠东县| 莱芜市| 肇州县| 靖江市|