左右用R右手Python系列——字符串格式化輸出

2021-03-02 數據小魔方

學習Python不到一個月,雖然學的很渣,但是還是想通過這種途徑分享自己的學習心得,畢竟當初學習R語言也是這麼走過來的。

今天是R語言與Python綜合系列的第一篇,就聊一聊兩者在常用字符串輸出上的差異。

為了方便統一案例圖片的風格,今天統一在jupyter編輯器中編輯(R和Python)。

通常在R語言中我們使用最多的關於字符串輸出函數是paste和paste0。

這兩著之間的差別非常微小,如同其字面意思一樣,前者可以自定義字符串間隔符號,後者則默認沒有間隔符號。

paste和paste0都可以完成單個向量字符串的連接以及兩個向量間的匹配。

#生成10個隨機大寫字母作為案例:

myword<-sample(LETTERS,10,replace=FALSE)

我們可以列印出兩個函數的詳細參數表:

paste

function (..., sep = " ", collapse = NULL) #sep參數默認間隔為空格

.Internal(paste(list(...), sep, collapse))

paste0

function (..., collapse = NULL)           #sep沒有間隔參數(無間隔)

.Internal(paste0(list(...), collapse))

單個向量的連接成字符串:

paste(myword,collapse="-")

'Q-C-X-B-M-I-E-P-G-V'

在拼接單個向量之時,通過設置collapse參數來控制字符之間的間隔符,最終輸出一個單值字符串。

paste0(myword,collapse="-")

'Q-C-X-B-M-I-E-P-G-V'

我們可以看到,在拼接單個向量為字符串的過程中,paste和paste0兩個函數並無太大區別,因為不涉及匹配參數sep。

通常情況下,我們使用paste和paste0做向量間的匹配情況比較多,這種情況多見於遍歷網頁,遍曆日期等。

比如假如我們們要遍歷一個網頁的網址如下:

隨機打開了網易雲課堂的一個課程欄目,看到一共有22頁課程,此時最簡單的遍歷網頁方法就是通過paste或者paste0。

http://study.163.com/category/400000000146050#/

url<-"http://study.163.com/category/400000000146050#/?p="

num<-1:22

myurl<-paste(url,num,sep="");myurl

myurl<-paste0(url,num);myurl

對比兩個函數的用法,大家應該能領會其中的差別了吧,paste0把paste的sep參數簡化了,直接強制設定為無間隔,此時做向量間匹配的話,paste0函數就可以不用設置sep參數,而paste則需設置,當然雖然在遍歷網頁時確實節省代碼,但也不是任何場合都是如此。

比如我要拼接時間與日期,而且要求以「-」間隔,此時你還是需要使用傳統的paste函數來完成這個任務,因為paste0已經不存在sep參數了。

mydate<-paste(2001:2005,"06",sep="-");mydate

還有一個stringr包中字符串拼接函數str_sub()也可以高效的完成上述工作,但是因為需要額外加載包,所以平時我用的頻率不高。

library(stringr)

str_c(myword,collapse ="")

str_c(url,num,sep = "")

在R語言中,字符串格式化輸出除了以上常見操作之外,還有一些非常重要的需求,比如格式化輸出百分比,格式化輸出日期時間等。

以百分比為例:

我們可以通過一些擴展包內提供的百分比構造函數來高效的完成百分比構造過程。

library(sca)

library(dplyr)

percent(seq(0,0.1,0.01),d=2,sep="") #其中的參數控制百分比輸出的小數點後位數。

library(scales)

percent(runif(10,0,1))         #percent函數說明了目前沒法看到如何控制小數點顯式位數。

接下來跟大家介紹一個重量級的函數——sprintf。此函數據說來頭不小。(據說繼承自C/C++),該函數的使用可以大大簡化字符串格式化輸出的操作流程。

%d 整數    %02d   d代表整數;2代表長度;0代表不足長度用0補齊

%f 浮點數  %4.2f  第一個數字代表總位數;第二個數字代表小數點位數 

%s 字符串 

%% 百分比

該函數的參數遠不止這三個,太多我也記不住,而且平時使用頻率最高的也就這三個,所以秉著投入回報率最高的原則,建議大家用什麼記什麼。

所以以上百分比過程便只剩下這麼幾個代碼:

sprintf("%d%%",1:10) #遍歷百分比

sprintf("%d-%d-%02d",2001,12,1:30) #遍曆日期:

sprintf("有%.1f%%的人評價變形金剛5較差",30.7)

'有30.7%的人評價變形金剛5較差'   

sprintf("%s是阿里巴巴的%s","馬雲","老闆")

'馬雲是阿里巴巴的老闆'

當然,以上過程完全可以通過paste和str_c函數完成,只是sprintf函數來寫這些東西看起來更優化,更有逼格。

好了重於輪到Python了,對於一個小菜鳥來說,第一次寫Pyhon的教程心情很忐忑,注意了下面要換編輯器了(雖然仍然使用的jupter裡)。

Pyhton:

Pyhton中的字符串格式化輸出大概有兩套比較完善的系統(我所知的)。

其實第一套系統應該也是源於C/C++(感覺跟R裡面的格式化符號規則是一致的)

print("I'm %s. I'm %d year old" % ('raindu',26))

以上使用print函數輸出了寶寶的大名和芳齡~_~,python中的字符串格式符規則是,在要輸出的主句中對應位置插入格式符,在句尾之後使用 % 連接一個元組,元組內提供主句所有的待格式化的字符串,有幾個需要格式化的字符串就需要在元組中提供幾個字符串對象,而且順序一定要與待格式化的字符串在主句的位置一一對應。

另一種方式可以使用字典進行字符傳遞。 

print("I'm %(name)s. I'm %(age)d year old" % {'age':26,'name':'raindu'})

這種方式最大的好處就是,以命名參數的形式傳入,這樣可以不用考慮字典內的鍵值對順序。(因為有名字可以索引)

Python中的字符串格式化符號相對於R規定的更加嚴格、細緻,上述所述R中的字符串:%s、數值%d、浮點型%f是通用的。

除此之外,格式化符號內部還可以提供更為詳盡的格式控制。

%[(name)][flags][width].[precision]typecode

(name)為名稱

flags可以有+,-,' '或0。+表示右對齊。-表示左對齊。' '為一個空格,表示在正數的左側填充一個空格,從而與負數對齊。0表示使用0填充。

width表示顯示寬度

precision表示小數點後精度

但是發現網上關於Python教程中,使用最多的還是.format這種字符串輸出形式。

format 函數:

'{2},{1},{0}'.format("小偉","大偉","小三")

'小三,大偉,小偉'

'{1}和{0}是一對{2}'.format("大偉","小偉","基友")

'小偉和大偉是一對基友'

這種傳參的方式可以看做是位置參數(順序),即在要輸出的主句中插入末尾提供的對應字符串位置,即可完成格式化過程。

如果你不想在主句對應的花括號內寫位置參數,你必須保證末尾提供的字符串順序與主句對應要插入的位置保持一致。

'{}和{}是一對好{}'.format("大偉","小偉","基友")

當然,你也可以在format括號內內對字符串進行命名,然後將對應名字傳入主句對應花括號內部。

"I'm {name}. I'm {age} year old".format(age=26,name='raindu')

這種情況下你也不必考慮format括號內的字符串對應順序,因為所有的字符串都有名稱,只傳入名稱,函數即可自動完成索引配對。

使用以上兩種方式都可以方便的遍歷網頁:

url="http://study.163.com/category/400000000146050#/?p="

myurl1=[]

for i in range(1,23):

    urlm=url+'%d' % i

    myurl1.append(urlm)

    print(urlm)

myurl1=[]

for i in range(1,23):

    urlm=url+'{}'.format(i)

    myurl1.append(urlm)

    print(urlm)

好了今天就這樣了,要同時貫穿兩門語言真的不是一件容易的事情,長路漫漫以後日子要苦逼了。

總結一下:

R語言字符串格式化輸出:

paste/paste0

stringr::str_c

sca::percent

scales::percent

sprintf

Python字符串格式化輸出:

關於傳參的規則:

使用格式化符號可以通過位置參數【比較好用】、命名參數來實現字符串格式化輸出【使用字典反而繁瑣了】。

使用.format格式化輸出可以通過順序參數(編號順序)、位置參數(前後位置順序需一致)、名稱參數(比較自由不用考慮順序)


相關焦點

  • Python格式化字符串(格式化輸出)
    ,比如格式化輸出,這就是本節要講解的內容。表 1 Python 轉換說明符轉換說明符解釋%d、%i轉換為帶符號的十進位整數%o轉換為帶符號的八進位整數%x、%X轉換為帶符號的十六進位整數%e轉化為科學計數法表示的浮點數(e 小寫)%E轉化為科學計數法表示的浮點數(E 大寫)%f、%F轉化為十進位浮點數%g智能選擇使用 %f 或 %e 格式%G智能選擇使用 %F 或 %E 格式%c格式化字符及其 ASCII 碼%r使用
  • python格式化字符串研究
    前言與隊友交流時提及python的格式化字符串漏洞,這個漏洞之前接觸不多,所以寫篇文章從基礎部分仔細研究了研究。python環境是python3.7。Python3裡的格式化字符串python3中的格式化字符串主要有以下兩種形式:"test %s" % ('test')"test {0}".format('test')這兩個語句的輸出都是test test。
  • Python中的轉義字符串與格式化字符串
    # 格式化字符串# 常用佔位符# %s 格式化字符串# %d 格式化整數格式化字符串# 使用佔位符,格式化print("我喜歡%s,在%s年" %(c,n))f = 1.133格式化字符串# 轉義字符串# \\# \'
  • 聊一聊:Python格式化字符串
    下面整理了一下Python中字符串格式化符合:格式化符號說明%c轉換成字符(ASCII 碼值,或者長度為一的字符串)%r優先用repr()函數進行字符串轉換%s優先用str()函數進行字符串轉換%d / %i轉成有符號十進位數%u
  • Python中的格式化字符串與轉義字符串
    # 格式化字符串 # 常用佔位符 # %s 格式化字符串 # %d 格式化整數 # %f 格式化浮點數,可指定小數後的精度 # 如:我喜歡你,在2020
  • 一文看懂Python列表、元組和字符串操作
    bu"中文字符組成的字符串"作用:以 Unicode 格式 進行編碼,一般用在中文字符串前面,防止因為源碼儲存格式問題,導致再次使用時出現亂碼。r"\n\n\n\n」  # 表示一個普通生字符串 \n\n\n\n,而不表示換行作用:去掉反斜槓的轉義機制,常用於正則表達式,對應著re模塊。b』Hello World』   # 表示這是一個 bytes 對象作用:b" "前綴表示:後面字符串是bytes 類型。在網絡編程中,伺服器和瀏覽器只認bytes 類型數據。
  • 小瘋談python:字符串的拼接與格式化輸出
    在上一篇文章中我想大家介紹了字符串的內置操作函數和方法,不過對於字符串來說這並不是最重要的知識點,因為對於字符串的操作我們一般首選是使用正則表達式。對於初學者來說,字符串最重要的其實是其格式化輸出,因為一個程序運行結束後,如果要我們要列印相關的數據,絕大多數情況下都是以字符串的形式呈現在控制臺。
  • Python Lesson 1 輸出|轉義字符|原字符
    3.搭建python開發環境hello world[python 輸出函數]1. print ( ) 函數可以將想要展示的東西在IDLE或標註的控制臺上顯示print ( ) 可以輸出數字520print ( ) 可以輸出字符串——字符串要用『』或者「
  • 深入解析sprintf格式化字符串漏洞
    break了,php未做任何處理,直接跳過,所以導致了這個問題:沒做字符類型檢測的最大危害就是它可以吃掉一個轉義符, 如果%後面出現一個,那麼php會把\當作一個格式化字符的類型而吃掉, 最後%\(或%1$\)被替換為空因此sprintf注入,或者說php格式化字符串注入的原理為: 要明白%後的一個字符(除了%,%上面表格已經給出了)都會被當作字符型類型而被吃掉
  • 字符串格式化表達式與佔位符和類型碼有什麼關係?程式設計師不一定知道
    大家好,前面我們學了字符串的方法調用,對於字符串的方法,不需要去死記硬背,平時只要記住用法就行了,到了需要用它的時候,找到其語義,拿出來用就行。今天,我們接著講字符串的格式化表達式。一:什麼是字符串的格式化表達式?1、 字符串的格式化表達式,運算符是:%。其作用是生成一定格式的字符串。
  • 字符串輸出的4種方式:Python String Formatting Best Practices
    基於這些變量,你想生成一個包含簡單錯誤信息的輸出字符串。>>>'hi,Bob,有一個0xbadc0ffee錯誤!'這個錯誤真的會毀了一個開發人員的周一早晨.但我們在這裡討論的是字符串格式化。所以讓我們開始工作吧。Python 中的字符串有一個獨特的內置操作,可以用 % 操作符訪問。這讓您可以非常容易地進行簡單的位置格式化。
  • Python2.6版本以後的format()方法格式化字符串
    第七十九節:format()方法格式化字符串Python的版本進化到2.6版以後,創造了format()方法使用字符串對象對字符串進行格式化。format()方法格式化字符串的語法是這樣的:str.format(args)它的參數說明如下:str用於指定字符串模板;args就是要轉換的項,有多個項時,使用逗號分隔。
  • 為什麼 Python 的 f-string 可以連接字符串與數字?
    本文出自「Python為什麼」系列,歸檔在 Github 上:https://github.com/chinesehuazhou/python-whydo毫無疑問,Python 是一門強類型語言。強類型語言。強類型語言!
  • Python如何定義變量,不可變數據,數字、字符串、元組詳解
    print()列印多個值,用逗號隔開。用type() 函數輸出結果:列印結果對應數字的四種類型。String(字符串):Python中的字符串用單引號或雙引號括起來。建議如果字符串裡面有單引號最外面用雙引號,字符串裡面有雙引號用單引號。如果都是用單引號或者雙引號,字符串裡面有單引號、雙引號或者特殊字符需要用\反斜槓轉義。變量a和b就原樣輸出,變量c和d輸出結果為:變量c輸出結果換行了,它裡面\n換行符,而變量d輸出結果沒有換行,還多出\n。\\n把\n轉義成不是特殊字符。
  • python實踐分享:格式化字符串時使用.format方式還是「%」
    Python中內置的%操作符和.format方式都可用于格式化字符串。先來看看這兩種具體格式化方法的基本語法形式和常見用法。%操作符根據轉換說明符所規定的格式返回一串格式化後的字符申,轉換說明符的基本形式為:%[轉換標記][寬度[.精確度]]轉換類型。
  • Python基礎:數據類型和變量&字符串和編碼
    字符串字符串是以單引號'或雙引號"括起來的任意文本,比如'abc',"xyz"等等。請注意,''或""本身只是一種表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c這3個字符。如果'本身也是一個字符,那就可以用""括起來,比如"I'm OK"包含的字符是I,',m,空格,O,K這6個字符。如果字符串內部既包含'又包含"怎麼辦?
  • 對比python字符串函數,學習pandas的str矢量化字符串函數
    我們不僅要學會怎麼處理單個字符串,這個就需要學習「python字符串函數」,我們還要學會怎麼處理二維表格中每一列每一格的字符串,這個就需要學習「pandas的str矢量化字符串函數」。今天我們採用對比的方式,帶大家總結常用的字符串函數,希望這篇文章能夠對大家起到很好的作用。
  • CTF必備技能丨Linux Pwn入門教程——格式化字符串漏洞
    教程僅針對i386/amd64下的Linux Pwn常見的Pwn手法,如棧,堆,整數溢出,格式化字符串,條件競爭等進行介紹,所有環境都會封裝在Docker鏡像當中,並提供調試用的教學程序,來自歷年賽事的原題和帶有注釋的python腳本。今天i春秋與大家分享的是Linux Pwn入門教程第七章:格式化字符串漏洞,閱讀用時約12分鐘。
  • Python入門之字符串基本操作(Python官方文檔翻譯)
    The print() function produces a more readable output, by omitting the enclosing quotes and by printing escaped and special characters:在交互解釋器中,輸出字符串用引號括起來,特殊字符用反斜槓進行轉義。
  • 左手用R右手Python系列13——字符串處理與正則表達式
    grep/grepl()  這是一組功能雷同的字符串篩選函數(前者可以輸出對應符合條件的記錄序號或者真實值,後者直接輸出布爾值),何為篩選,就是它只能把包含目標匹配模式的字符串對象篩選出來,但是呢,如果你需要繼續提取其中的目標字符串模式,則需進一步使用其他提取函數進行提取,所以實際上他只是過濾掉了那些不包含目標模式的字符串。