日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

Python二分查找+字符串模板+textwrap模塊,_python

作者:??夢想橡皮擦???? ? 更新時間: 2022-07-09 編程語言

前言:

這個系列的專欄是為了保持 Python 手感而創(chuàng)建的,也可以用來學(xué)習(xí) Python,因為存在知識跨越難度,所以先學(xué)習(xí)滾雪球系列為佳。

二分查找

問題場景?在一個升序的數(shù)組中(其實就是一個只有整數(shù)的列表),查找一個目標(biāo)數(shù)的下標(biāo),不存在返回?-1?。

解決思路?因為數(shù)組是升序的,所以二分查找就能落地了 先取出數(shù)組中的中間值,與目標(biāo)數(shù)比較大小,確定一半的范圍 然后重復(fù)上述步驟不斷縮小范圍即可。

編碼如下:

def search(nums, start, end, target):
    if start > end:
        return -1
    # 獲取中間值
    mid = (start + end) // 2
    # 比較中間值與目標(biāo)數(shù)的大小關(guān)系
    if nums[mid] > target:  # 中值大于目標(biāo)數(shù)據(jù),目標(biāo)數(shù)在左側(cè)
        return search(nums, start, mid, target)
    if nums[mid] == target:  # 中值等于目標(biāo)數(shù)據(jù),返回
        return mid
    if nums[mid] < target:  # 中值小于目標(biāo)數(shù)據(jù),目標(biāo)數(shù)在右側(cè)
        return search(nums, mid, end, target)
if __name__ == '__main__':
    ret = search([1, 2, 3, 4], 0, 4, 1)
    print(ret)

字符串模板

問題場景?+?拼接字符串會讓代碼變得難以閱讀,是否存在其它辦法可以將字符串進行格式化?

解決思路?Python 字符串允許出現(xiàn)占位符,然后再通過特定的代碼將占位符替換掉。

編碼如下:

import string
tp1 = string.Template('你正在閱讀$name的博客')
tp2 = string.Template('你正在閱讀${name}的博客')
s1 = tp1.substitute(name="橡皮擦")
s2 = tp2.substitute(name="橡皮擦")
print(s1)
print(s2)

其中?$?是占位符開頭的特殊符號,如果字符串本身也存在?$?符號,需要使用?$$?代替。 字符串模板使用的是?string?模塊中的?Template?類,替換字符串需要調(diào)用對象的?substitute()?方法。 需要特別注意的是如果?substitute()?方法中的參數(shù)數(shù)量與模板中不一致,Python編譯器也不會拋出錯誤。

import string
tp1 = string.Template('你正在閱讀$name的博客')
s1 = tp1.substitute(name="橡皮擦", age=18) # 參數(shù)不一致,不會出現(xiàn)錯誤
print(s1)

但反之如果字符串模板中存在一個占位符,但是?substitute()?方法中沒有提供,就會拋出異常。

import string
tp1 = string.Template('你正在閱讀$name的博客')
tp2 = string.Template('你正在閱讀${name}$age的博客')
s1 = tp1.substitute(name="橡皮擦", age=18)  # 參數(shù)不一致,不會出現(xiàn)錯誤
s2 = tp2.substitute(name="橡皮擦")  # 但是這樣確發(fā)生錯誤
s3 = tp2.safe_substitute(name="橡皮擦")
print(s1)
print(s2)
print(s3)

解決上述問題的辦法,就是使用 字符串模板類中提供的另一個?safe_substitute()?方法,代碼如下

import string
tp1 = string.Template('你正在閱讀$name的博客')
tp2 = string.Template('你正在閱讀${name}$age的博客')
# s2 = tp2.substitute(name="橡皮擦")  # 但是這樣確發(fā)生錯誤
s3 = tp2.safe_substitute(name="橡皮擦") # 不會報錯
# print(s2)
print(s3)

textwrap 模塊

問題場景?Python中可以對文本,即字符串進行更加細(xì)致的操作,例如自動換行,填充字符。

解決思路?使用?textwrap?模塊進行操作。 首先使用?help()?函數(shù)查看該模塊具有哪些類與方法。

模塊內(nèi)具備類?TextWrapper(builtins.object)?,具備如下方法:

  • dedent(text):移除 text 中每一行的任何相同前綴空白符;
  • fill(text, width=70, **kwargs):將單個段落包裝在 text 中,并返回包含已包裝段落的單個字符串,fill()?和?wrap()?方法類似,分割結(jié)果相同,但返回結(jié)果形式不同,它的作用就是在分割的片段之間添加?\n?,然后將其重新變成一個文本進行輸出;
  • indent(text, prefix, predicate=None):將 prefix 添加到 text 中選定行的開頭;
  • shorten(text, width, **kwargs):在 text 中截取給定 width 的字符;
  • wrap(text, width=70, **kwargs):將 text 中的單個段落(字符串)換行,每一行最多為?width?個字符長。返回輸出行列表,不帶最終換行符。

編碼如下?textwrap.wrap()

import textwrap
text = "你好, 我是橡皮擦  這是Python學(xué)習(xí)的第2天"
result = textwrap.wrap(text,10)
print(result)

輸出結(jié)果如下:

textwrap.fill()

import textwrap
text = "你好, 我是橡皮擦  這是Python學(xué)習(xí)的第2天"
result = textwrap.fill(text,10)
print(result)

textwrap.dedent(text)?該方法可以移除不需要的前綴空格。可以用來使三引號的字符串與顯示的左邊緣對齊,同時仍然以縮進的形式在源代碼中顯示。

import textwrap
text = '''
    大家好
                    我是橡皮擦
    這是大家的Python博客'''
print(text)
print("*"*100)
print(textwrap.dedent(text))

運行結(jié)果如下:

textwrap.indent()

import textwrap
sample_text = '''
    你好,我是橡皮擦
    這是我的博客
    寫作的內(nèi)容都是 Python
    希望得到你的關(guān)注
    '''
dedented_text = textwrap.dedent(sample_text)
final = textwrap.indent(dedented_text, '> ')
print(final)

運行結(jié)果如下:

按照空格統(tǒng)計詞組個數(shù)

問題場景?一個段落,例如 "我 是 橡皮擦,這 是 大家 的 Python 博客",統(tǒng)計出有多少詞組。

解決思路?通過判斷字符的前一字符是空格進行判斷。

編碼如下

class Ca:
    def phrase_count(self, p):
        c = 0 # 統(tǒng)計個數(shù)
        for i in range(len(p)):
            # 如果當(dāng)前字符不為空格并且不是第一位或者前一字符不是空格
            if p[i] != ' ' and (i == 0 or p[i - 1] == ' '):
                # 加1
                c += 1
        return c
if __name__ == '__main__':
    c = Ca()
    p = '我 是 橡皮擦,這 是 大家 的 Python 博客'
    print(f"詞組個數(shù)是:{c.phrase_count(p)}")

用 “0” 填充字符串

問題場景?在字符串前面填充占位符?0?。

解決思路?使用?zfill()?方法返回指定長度的字符串,原字符串右對齊,前面填充?0

編碼時間

str = "橡皮擦的博客"
print(str.zfill(20))
print(str.zfill(30))

原文鏈接:https://juejin.cn/post/7073687281059512351

欄目分類
最近更新