前言
本篇主要介紹基本資料型別,以文本進度條為例,介紹time庫的使用,
并在最后對蟒蛇繪制的代碼進行分析,
(從本篇開始,出現的一些庫中函式介紹以及部分簡單代碼都將以圖片形式呈現)
讀完本篇,你將了解:
1.方法論
Python語言數字及字串型別
2.實踐能力
初步學會編程進行字符類操作
本篇將系統介紹:
1.數字型別及操作(整數、浮點數、復數及相關函式)
2.字串型別及操作(字串及字串序號、操作函式、型別的格式化)
3.模塊2: time庫的使用(時間獲取、格式化、程式計時應用)
4.實體3:文本進度條(簡單開始->單行動態重繪->完整效果)
了解基本資料型別之后, 通過字串、數字的組合,將能很容易的操作字符,使我們能更好的開展程式設計
一、數字型別及操作
1.整數型別
與數學中整數的概念一致,可正可負,沒有取值范圍限制
(1)pow(x,y)函式∶計算x的y次方,由于整數沒有限制,想算多大算多大
(2)4種進制表示形式
①十進制:1010,99,-217
②二進制,以0b或0B開頭:0b010,-OB101
③八進制,以0o或0O開頭:0o123,-OO456
④十六進制,以0x或0X開頭:0x9a,-0X89
2.浮點數型別
與數學中實數的概念一致,帶有小數點及小數的數字
(1)注意:浮點數取值范圍和小數精度都存在限制,但常規計算可忽略
取值范圍數量級約-10^(308) 10^(308)
精度數量級:10^-16
(2)不確定尾數:浮點數間運算存在不確定尾數,不是bug
①舉例:>>> 0.1 + 0.3輸出0.4
>>> 0.1 +0.2輸出0.30000000000000004
涉及到計算機對數字運算的內部實作原理
②原理:計算機中采用二進制表達數字,Python中采用53位二進制表示小數部分,約10^-16
由于計算機中的二進制跟十進制之間,不存在嚴格的對等關系,計算機只能截取53位,無限接近0.1
輸出時只保留16位,之后的并未輸出,故二進制與十進制之間轉換出現不確定尾數
(3)round(x, d):對x四舍五入,d是小數截取位數
①浮點數間運算及比較用round()函式輔助
②不確定尾數一般發生在10^-16左右,round()十分有效
(4)科學計數法
①格式:使用字母e或E作為冪的符號,以10為基數,格式如下:
(a)e(b)表示a*10b
②例如∶4.3e-3 值為0.0043或9.6E5值為960000.0
3.復數(僅Python提供)
與數學中復數的概念一致
(1)定義j=√(-1),以此為基礎,構建數學體系
(2)a+bj被稱為復數,其中,a是實部,b是虛部
(3)z.real獲得實部、z.imag獲得虛部
(4)客觀說常規編程中很少使用,但是它卻是進行空間變換,尤其是跟復變函式相關的科學體系中最常用的一種型別
4.數字型別及操作
運算子是完成運算的一種符號體系
(1)一些基礎運算子

注意:/的結果保留小數

(2)對二元運算子的增強型運算子

(3)數字型別的關系
型別間可進行混合運算,生成結果為"最寬"型別
①三種型別存在一種逐漸"擴展"或"變寬"的關系∶
整數->浮點數->復數
②例如:123 +4.0 = 127.0 (整數+浮點數=浮點數)
5.數值運算函式
(1)Python提供的一些函式


(2)數字型別轉換函式

二、字串型別及操作
1.字串型別的表示
(1)字串:
由0個或多個字符組成的有序字符序列
①字串由一對單引號或一對雙引號表示:"請輸入帶有符號的溫度值: "或’C’
②字串是字符的有序序列,可以對其中的字符進行索引(從0開始)
如:"請"是"請輸入帶有符號的溫度值:”的第O個字符
(2)字串有2類共4種表示方法
①由一對單引號或雙引號表示,僅表示單行字串
如:“請輸入帶有符號的溫度值: “或’℃’
②由一對三單引號或三雙引號表示,可表示多行字串(作用而言,也可當作注釋使用)
‘’’ Python
語言‘’‘
③如果希望在字串中包含雙引號或單引號呢?
若字串中出現雙引號,那么最外層的引號就要使用單引號,反之
如:'這里有個雙引號(”)‘或者"這里有個單引號(’)”
④如果希望在字串中既包括單引號又包括雙引號呢?
則用三個單引號表示
如:’‘’這里既有單引號(’)又有雙引號(")‘’‘
⑤故這4種方法存在冗余,使得字串中出現單引號或者雙引號的處理更方便簡單
(3)字串的序號
正向遞增序號和反向遞減序號

①使用[ ]獲取字串中一個或多個字符
1)索引∶回傳字串中單個字符 <字串>[M]
"請輸入帶有符號的溫度值: "[0]或者TempStr[-1]
2)切片:回傳字串中一段字符子串 <字串>[M: N]
“請輸入帶有符號的溫度值:”[1:3]或者TempStr[0:-1]
(這里之前說過,不再多作贅述)
②字串切片的高級用法
使用[M: N:K]根據步長對字串切片
1)<字串>[M: N],M缺失表示至開頭,N缺失表示至結尾
如:“o一二三四五六七八九十”[:3]結果是"O一二"(從最開始到3前一個為止)
2)<字串>[M: N: K],根據步長K對字串切片
“o一二三四五六七八九十”[1:8:2]結果是"一三五七"(從第一位置到第八位置前結束,步長為2取)
3)小技巧:將字串逆序[::-1]
“o一二三四五六七八九十”[::-1]結果是"十九八七六五四三二一o"
(從最開始到結尾,步長-1(即從后向前逐一取出),相當于逆序)
③轉義符
1)轉義符表達特定字符的本意
“這里有個雙引號(”)”結果為:這里有個雙引號(")
2)轉義符形成一些組合,表達一些不可列印的含義
如:"\b"回退“ \n"換行(游標移動到下行首)“ \r”回車(游標移動到本行首)
2.字串運算子
(1)由0個或多個字符組成的有序字符序列

(2)舉例:獲取星期字串
輸入∶1-7的整數,表示星期幾
輸出∶輸入整數對應的星期字串
例如∶輸入3,輸出星期三
weekStr = "星期一星期二星期三星期四星期五星期六星期日"
weekId = eval(input("請輸入星期數字(1-7):"))
pos = (weekId-1)*3 # 算出起始索引的位置
print(weekStr[pos:pos+3]) # 使用切片操作,將切片結果回傳給用戶
利用運算子改進
weekStr = "一二三四五六日"
weekId = eval(input("請輸入星期數字(1-7):"))
print("星期"+weekStr[weekId-1])
3.字串處理函式
(1)一些以函式形式提供的字串處理功能

str和eval是一對對應的函式

這兩個函式也是一對對應函式
(2)Unicode編碼
Python字串的編碼方式
①統一字符編碼,即覆寫幾乎所有字符的編碼方式
②從0到1114111(Ox10FFFF)空間,每個編碼對應一個字符
③Python字串中每個字符都是Unicode編碼字符,使得Python程式不限于中文英文韓文日文俄文等
④一些有趣的例子:
>>> "1 +1 = 2 " +chr( 10004)輸出’1 +1 = 2 √’
4.字串處理方法
(1)方法
"方法"在編程中是一個專有名詞
①"方法"特指(a).(b)風格中的函式b()
②方法本身也是函式,但與a有關,是a能提供的函式,必須a.b()風格使用(面向物件的一種使用風格)
③字串及變數也是a,存在一些方法
(2)8個常用方法(字串及變數也是a,存在一些方法)



①split()函式:例子中用逗號分隔字串,即只要出現逗號就會把字串拆解為兩個部分
故A后的逗號就會將A單獨形成一個字串,B同樣,然后將他們放成一個串列型別回傳給用戶
②center()函式:(對字串格式進行處理)根據width居中,居中后剩余兩側填充為fillchar(使列印規則的輸出處理簡易)
③strip()函式:去除字串左右兩側預定義字符
5.字串型別的格式化
格式化是對字串進行格式表達的方式
(1)字串格式化使用.format()方法,用法如下:
<模板字串>.format(<逗號分隔的引數>)
(2)槽
相當于一個占位資訊符,它使用一對{}來表示,只在字串中有用
①舉例

1)每一個槽中所要添加的內容與.format方法中對應的引數相一致
2)槽的3個順序在不指定的情況下默認為012
3)將format方法中的引數按照對應順序填到模板字串的槽中
4)進一步可在槽中指定需要添加的引數的位置

(3)Python語言使用槽機制加上format方法,來形成字串的格式化
除引數序號之外,如果某一個槽中確定關聯的某一個引數,可以對引數的輸出格式進行控制,
在槽內部使用格式化的控制標記來進行格式控制
(4)format()方法的格式控制
①槽內部對格式化的配置方式
通過一個冒號來引導一些引數,控制某一個變數在槽位置的輸出格式
Python一共提供了六種格式控制標記

分為兩組記憶
②前三個引數為一組,這三個引數分別表達填充、對齊和寬度
基本模式:
1)給出一個輸出寬度
2)決定即將輸出的這個引數在這個寬度中的對齊方式
3)確定對齊方式之后,若還有空余空間,該填充什么字符
首先要給定填充,其次設定對齊,最后設定寬度
4)舉例

第一個例子中:
在一個模板字串中,槽中給出“:=^20”,=指填充符號,空余空間中填=的單字符
^表明居中對齊(>指右對齊)指的是所放入槽中的format方法中的第0個引數以居中對齊方式來顯示
20指輸出寬度
第三個例子中:
省略填充、對齊,直接給出寬度,默認情況下填充為空格,變數左對齊
③后三個都是與具體的數字有關(控制數字型別輸出)
1)<,>:數字的千位分隔符(這種情況只有在輸出字串,但是當作數字給人閱讀的時候才會使用)
2)<.精度>:浮點數小數精度或字串最大輸出長度
3)<型別>:我們以什么樣的型別將變數放到槽中
4)舉例

第一個例子中:
.2f表示保留兩位小數并使用千位分隔符
第二個例子中:
對425以:b的形式輸出二進制格式,以:c的形式輸出字符形式(即Unicode編碼形式)
以:d的形式輸出十進制格式, 以:o的形式輸出八進制格式
以:x的形式輸出十六進制格式, 以:X的形式輸出大寫十六進制格式
第三個例子中:
以:e的形式采用科學計數法e形式表示浮點數, 以:E的形式采用科學計數法E形式表示浮點數,
以:f的形式采用通常的非科學計數法表示浮點數, 以:%的形式采用百分號形式表示浮點數,
三、time庫的使用
1.time庫基本介紹
(1)time庫是Python中處理時間的標準庫
①計算機時間的表達
②提供獲取系統時間并格式化輸出功能
③提供系統級精確計時功能,用于程式性能分析
(2)使用方法:
import time
time.b()
以此呼叫相關函式(最典型最直接Python庫的使用方法)
(3)time庫包括三類函式
①時間獲取:time() ctime() gmtime()
②時間格式化并輸出: strftime() strptime()
③程式計時(time庫的重要功能): sleep(), perf_counter()
2.時間獲取
(1)一些函式

①時間戳是一個很長的浮點數,表示從1970年1月1日0:00開始,到當前這一時刻為止的,一個以秒為單位的數值
②ctime():給出一個具體的時分秒的時間(time庫中獲取人類譯讀方式時間的最簡單的函式)

③gmtime():獲取當前時間,但獲取后生成的格式不一樣,生成的是一種計算機程式可以處理的時間格式
(2)這三個函式基本能對獲取來的時間做所有可能的后續處理
3.時間格式化
將時間以合理的方式展示出來
(1)格式化
①格式化:類似字串格式化,需要有展示模板
②展示模板由特定的格式化控制符組成(告訴程式輸出的時間大概是什么樣子)
③實作時間格式化的方法:strftime()方法
(2)strftime()

(3)時間格式化很重要的一點
將計算機內部時間中,表達的年月日時分秒等相關的與時間有關的資訊,用一種變數的形式進行合理組合,并合理輸出
通過控制來表達輸出格式
(4)time庫中的控制符
格式:%+字母


(可回顧剛剛的例子)
(5)strptime()

將一個字串變成一個計算機內部可操作的一個時間(特定程式中才會使用)
4.程式計時應用
(1)程式計時應用廣泛
①程式計時指測量起止動作所經歷時間的程序
②測量時間: perf_counter()(獲取計算機中CPU以其頻率運行的時鐘,往往以納秒來計算,非常精準)
③產生時間: sleep()(讓程式休眠或產生一定時間)
(2)perf_counter()

(3)sleep()

四、實體4:文本進度條
1.需求分析
(1)文本進度條
①采用字串方式列印可以動態變化的文本進度條
②進度條需要能在一行中根據程式的運行逐漸變化(與時間有一定關系)
(2)如何獲得文本進度條的變化時間?
采用sleep()模擬一個持續的進度
2.“文本進度條“簡單的開始
(1)代碼實作
# TextProBarV1
import time
scale = 10
print("------執行開始------")
for i in range(scale+1):
a = '*' * i
b = '.' * (scale-i)
c = (i/scale)*100
print("{:3.0f}%[{}->{}]".format(c, a, b))
time.sleep(0.1)
print("------執行結束------")
①該代碼完成了一個基本的文本進度條框架
②執行效果:生成一個有開始、結束標記,且有一定進度百分比表示的進度條格式

(2)代碼簡單分析
①引入time庫,使用time庫的sleep()函式來生成一個持續不斷的時間
②列印“執行開始”“執行結束”作為標簽
③定義變數scale=10,指文本進度條的大概的寬度
④for回圈模擬進度:for i in range(n)結構
⑤基本原理:定義休眠時間,每次回圈都會列印當前進度條狀態,進行一個簡單的休眠
⑥for回圈中的相關作業:
1)a等于字符(乘號)與回圈變數i的乘積(字串與整數的乘積表示字串被復制的次數)
指當前百分比所表達的資訊
2)b等于’.'與當前剩余的進度條的比例之間的乘積
3)a與b構成當前進度比例中,與已經執行的和未知執行的之間的對應的(星號)和‘.'兩者之間的關系
4)變數c等于i除以scale乘以100,輸出與當前進度條與進度相關的百分比
⑦print函式設定三個槽,在每個槽中增加了百分比以及相應字串
⑧指向效果如上圖
3.“文本進度條“單行動態重繪
(1)單行動態重繪:
重繪的關鍵是\r
①重繪的本質是:用后列印的字符覆寫之前的字符
②不能換行:print()需要被控制(print()默認輸出之后會換行到下一行)
③要能回退:需要讓列印后游標退回到之前的位置\r(輸出字串之后,游標會移動到字串之后)
(2)代碼實作
# TextProBarV1
import time
for i in range(101):
print("\r{:3}%".format(i), end="")
time.sleep(0.1)
①使用time庫及sleep()函式,101次的回圈(0%到100%)
②代碼關鍵:print函式
輸出資訊之后,增加,end=""這樣一個引數,可以改變每一次print輸出最后增加的那個資訊
比如在這里我們使end賦值為空字串,那么print函式每一次輸出字串之后,不會增加換行
只會把游標停留在當次輸出字串的后面
③總結:若希望輸出的字串后面增加什么資訊,就在end引數中增加,不希望增加換行,使end賦值為空字串
④print的第一個引數:\r,一個槽,并給出百分號
\r:列印輸出之前,它能夠使游標退回到當前行的行首
4.“文本進度條“實體完整效果
(1)代碼實作
# TextProBarV3
import time
scale = 50
print("執行開始".center(scale//2, "-"))
start = time.perf_counter()
for i in range(scale+1):
a = '*' * i
b = '.' * (scale - i)
c = (i / scale) * 100
dur = time.perf_counter() - start
print("\r{:3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end="")
time.sleep(0.1)
print("\n"+"執行結束".center(scale//2, '-'))
(2)代碼分析
與第一段代碼很接近,重點分析修改
①第一個和最后一個print,center函式用-填充在兩側
②增加計時效果:對程式進度有更好的展示(程式運行開始變數start開始時間)
③for回圈:保留abc變數,新增dur變數記錄每一次需要列印文本進度條時所消耗的時間,當前時間減去最開始記錄的時間
④for中的print函式:列印文本進度條
1)單行重繪效果:最開始增加\r,實作游標向行首的移動
2)同時print函式要增加end引數,end賦值為空字串:每次輸出之后不換行
(3)效果:具有一定格式框架,有進度“*”輸出,又有時間記錄的完整的文本進度條
(4)這段代碼覆寫了字串處理,覆寫了數字處理,時間庫的使用
效果如圖

5.“文本進度條“舉一反三
(1)計算問題擴展
①文本進度條程式使用了perf_counter()計時
②計時方法適合各類需要統計時間的計算問題
③例如︰比較不同演算法時間、統計部分程式運行時間
(2)進度條擴展
①在任何運行時間需要較長的程式中增加進度條
②在任何希望提高用戶體驗的應用中增加進度條
③進度條是人機互動的紐帶之一
(3)文本進度條的不同設計函式(作擴展用)

總結
經過本篇的學習,可以大致掌握運用time庫去實作基本的文本進度條(本篇只是基礎),大家可以嘗試不同的進度條設計風格,善于使用time庫函式來抓取時間,
如有錯誤,歡迎指正!
注:代碼非原創
下篇將介紹程式的控制結構,
ps(又咕咕了)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/298954.html
標籤:python
