elasticsearch入門系列">elasticsearch入門系列
659
2022-05-30
一、 輸入和輸出
無論是從我們一開始的“hello world”,還是前面章節的里各種例子,基本都是些“自
說自話”。只有能夠接收用戶輸入,根據輸入動態生成結果,并輸出到屏幕上展示出來,
才算一個較為完整的簡單程序。
1. input 輸入函數
獲取用戶輸入,保存成一個字符串。哪怕你輸入的是個數字 1,返回給你的只會是字符
串“1”,而不是 整數 1。
示例:
>>> inp = input("please input your name: ") please input your name: jack >>> inp 'jack' >>> type(inp)
’ 前后帶有空白 ’
從上面例子的展示中,我們不難發現,input 函數將我們的輸入原樣不動的返回給了我
們,并包裝成一個字符串。這肯定是不行的,會帶來很多問題,所以通常我們都需要對
用戶輸入進行處理和判定。
比如對空輸入進行處理:
inp = input("請輸入你的姓名: ") if inp == "": inp = input("姓名不能為空,請重新輸入: ")
比如將字符串轉換成數字類型:
age = input("請輸入你的年齡: ") age = int(age) # 將字符串轉化為整數 if age > 18: print("你已經成年!") else: print("未成年?。?!")
去除開頭的空白 lstrip,去除結尾的空白 rstrip 以及去除兩端的空白 strip
inp = input("請輸入你的姓名: ") inp = inp.strip() # strip 的用法在字符串數據類型有講述 print(inp)
判斷輸入的字符類型
前面我們在將字符串轉化為整數用的是 int()函數,這種方式有危險的,看下面的例子:
>>> s = "123" >>> a = int(s) >>> a 123 >>> s = "something" >>> a = int(s) Traceback (most recent call last): File "
對于形如“123”, “283242”的字符串,轉化沒問題,但是對于包含字符、特殊字
符的字符串就沒辦法轉化了,會彈出異常錯誤。所以在使用 int 函數之前,要先對輸入
進行判斷。我們修改一下上面的例子:
age = input("請輸入你的年齡: ") if age.isdigit(): # 使用 isdigit 函數判斷輸入是否全是數字格式 age = int(age) # 將字符串轉化為整數 print("你的年齡是: ", age) else: print("輸入不合法!")
input 函數有時可以巧妙地用于阻塞或暫停程序
print("程序前面部分執行完畢......") input("請按回車繼續......") # 在這里程序會暫停,等待你的回車動作 print("繼續執行程序的后面部分......")
2,print 輸出函數
print 函數我們其實已經不陌生了,前前后后也用了不少次,多少有點經驗,明白點它
的用法了。
print 函數用于將內容格式化顯示在標準輸出上,主要指的是屏幕顯示器。
print 可以接受多個字符串,字符串類型的變量或者可 print 的對象。每個字符串用逗號
“,”隔開,連成一串輸出。print 會依次打印每個字符串,同時,每遇到一個逗號“,”
就輸出一個空格。
>>> a = "i am" >>> b = "student" >>> print(a,"a" , b) i am a student # 自動以空格分隔 >>> print(a+"a"+b) i amastudent # 無分隔
對于形如 print(a+“a”+b)的語句,其實是先計算 a+“a”+b 的值,然后再通過 print 打印
它。print()會自動執行內部的語句,輸出想要的結果。
我們看一下 print 函數的原型:print(self, *args, sep=’ ‘, end=’\n’, file=None)
sep 參數: 分隔的符號,默認是一個空格;
end 參數: 打印后的結束方式,默認為換行符\n。如果,設置 end=’’,則可以不換行,
讓 print 在一行內連續打印?;钣?print 的參數,可以實現靈活的打印控制。
>>> a = "i am" >>> b = "student" >>> print(a,"a" , b, sep="*") i am*a*student
3.print 格式化輸出
在 Python2.6 以后,有兩種格式化輸出的方式。
一種就是類似 C 語言的 printf 的%百分號格式化輸出,也是 Python 最基礎最常用的格
式化輸出方式。另一種就是 str.format()的方式,在前面的章節已經介紹過。
幾個的例子回顧一下:
s = "i am %s" % "jack" s = "i am %s age %d" % ("jack", 18) s = "i am %(name)s age %(age)d" % {"name": "jack", "age": 18} s = "percent %.2f" % 99.97623 s = "i am %(pp).2f" % {"pp": 123.425556, } s = "i am %.2f %%" % 123.425556
二、賦值語句
賦值語句用于把對象賦給一個名稱,基本形式是
賦值語句的目標 = 要賦值的對象
左側的目標可以是 變量名或對象元素,右側的對象可以是任何會計算得到的對
象的表達式
賦值語句的特性:
Python 中的變量賦值不需要類型聲明
賦值語句建立對象引用值
建立對象的引用值,而不是復制對象。python 變量更像是指針,而不是數據存
儲區域
變量名在首次賦值時會被創建
在首次將值賦值給變量時創建其變量名
變量名在引用前必須先賦值
使用尚未進行賦值的變量名是一種錯誤
示例:
spam = ‘Spam’ spam, ham = ‘yum’, ‘YUM’ #按照位置把右邊的對象和左邊的目標從左至右相配對 [spam, ham] = [‘yum’, ‘YUM’] a, b, c, d = ‘spam’ a, *b = ‘spam’ #a=s, b=pam 一個列表賦給了帶星號的名稱,該列表收集了序列中沒有賦值給其他名稱的所有 項。 a, *b, c = ‘spam’ # a=s, c = m, b = pa spam = ham = ‘lunch’ #多目標賦值 spam 和 ham 都是字符串 lunch 的引用 spams += 42 #增強賦值運算 spams = spams + 42 str = ‘spam’ a, b, c = str # error, 左右元素個數不匹配 a, b, c = str[0:3] # correct
三、注釋
我們寫的程序里,不光有代碼,還要有很多注釋。注釋有說明性質的、幫助性質的,它
們在代碼執行過程中相當于不存在,透明的,不參與任何工作。但在代碼維護、解釋、
測試等等方面,發揮著不可或缺的重要作用。每一位程序員都要盡量寫出高質量的注釋。
1. 單行注釋
Python 中,以符號“#”為單行注釋的開始,從它往后到本行的末尾,都是注釋內容。
#!/usr/bin/python3 # 下面這個方法的作用是….. # 第一個注釋 # 我是單行注釋 # 這是一個空的函數,它什么都不干。本條注釋也是句廢話。 def main(): pass # pass 表示占位,什么都不做
2. 多行注釋
多行注釋用三個單引號 ‘’’ 或者三個雙引號 “”" 將注釋括起來,例如:
單引號(’’’)
''' 這是多行注釋,用三個單引號 這是多行注釋,用三個單引號 這是多行注釋,用三個單引號 ''' print("Hello, World!")
雙引號(""")
""" 這是多行注釋,用三個雙引號 這是多行注釋,用三個雙引號 這是多行注釋,用三個雙引號 """ print("Hello, World!")
3. 注釋文檔
在某些特定的位置,用三引號包括起來的部分,也被當做注釋。但是,這種注釋有專門
的作用,用于為__doc__提供文檔內容,這些內容可以通過現成的工具,自動收集起來,
形成幫助文檔。比如,函數和類的說明文檔:
def func(a, b): """ 這個是函數的說明文檔。 :param a: 加數 :param b: 加數 :return: 和 """ return a + b class Foo: """ 這個類初始化了一個 age 變量 """ def __init__(self, age): self.age = age
需要強調的是這類注釋必須緊跟在定義體下面,不能在任意位置。
四、 語句與縮進
語句:在代碼中,能夠完整表達某個意思、操作或者邏輯的最短代碼,被稱為語句。語
句通常不超過一行,超過一行的稱為多行語句。
像下面的都稱為語句:
a = apple from . import modles print("haha") lis.append(item)
Python 的標準語句不需要使用分號或逗號來表示語句結束,簡簡單單的換個行就表示
本語句已經結束,下一句開始。
代碼塊:為完成某一特定功能而聯系在一起的一組語句構成一個代碼塊。有判斷、循環、
函數、類等各種代碼塊。代碼塊的首行通常以關鍵字開始,以冒號( : )結束。比如:
# 這是一個判斷流程代碼塊 if expression : pass elif expression : pass else : pass
又比如:
# 這是一個類代碼塊 class Foo: def __init__(self, name, age): self.name = name self.age = age def get_name(self): return self.name # 這是一個函數代碼塊 def func(a, b): summer = a+b return summer*2
Python 最具特色的語法就是使用縮進來表示代碼塊,不需要使用大括號({})。
縮進的空格數是可變的,但是同一個代碼塊的語句必須包含相同的縮進空格數。
如果縮進數的空格數不一致,會拋出縮進異常(請記住 IndentationError 這個異常名!
新手會經常和它做朋友):
File "test.py", line 6 print ("False") # 縮進不一致,會導致運行錯誤 ^ IndentationError: unindent does not match any outer indentation level
PEP8(Python 官方的代碼規范):建議使用四個空格作為縮進!在文本編輯器中,需
要設置把 Tab 自動轉換為 4 個空格,確保不混用 Tab 和空格。在 Pycharm 中:tab 鍵
被自動轉換成 4 個空格的縮進。
那么怎么才是正確的縮進方式呢?
所有的普通語句,頂左開始編寫,不需要縮進
所有的語句塊,首行不用縮進,從冒號結束后開始下一行,都要縮進
直到該語句塊結束,就退回縮進,表示當前塊已結束
語句塊可以嵌套,所以縮進也可以嵌套
比如,我們寫一個 if/else 的判斷控制語句塊:
首先是,第 1 句,不需要縮進:
if i > 10:
然后是第 2 句,這時已經進入 if 內部了,需要縮進:
if i > 10: i = i + 10 # 左邊有 4 個空格
接下來是第 3 句,因為還在 if 內部,所以保持和第二句一樣的縮進
if i > 10: i = i + 10 # 左邊有 4 個空格 print(i) # 左邊有 4 個空格
第 4 句,我們 if 分支走完了,要走 else 分支,那么 if 語句塊算結束了,縮進要回退。
if i > 10: i = i + 10 # 左邊有 4 個空格 print(i) # 左邊有 4 個空格 else:
第 5 句,進入 else 語句塊了,要縮進 4 個空格:
if i > 10: i = i + 10 # 左邊有 4 個空格 print(i) # 左邊有 4 個空格 else: i = i - 10 # 左邊有 4 個空格
第 6 句,else 分支也走完了,整個 if/else 流程完畢,下面是別的代碼了,那么 else 分
支的縮進也要退回。
if i > 10: i = i + 10 # 左邊有 4 個空格 print(i) # 左邊有 4 個空格 else: i = i - 10 # 左邊有 4 個空格 print("apple") # 縮進回退了,這里已經和 if、else 沒什么關系了。
再看一個縮進嵌套的例子,以兩個 for 循環嵌套為例:
for i in range(10): for k in range(10): # 同樣也是 for 循環,由于嵌套在另一個 for 內部,需要縮進 if k != i: # 雙重循環內的 if,需要 2 次縮進,也就是頂左開始 8 個空格 print(k) # 又嵌套了一個 if 語句塊,再次縮進 4 個空格,共計 12 個 else: # if 結束,回退 4 個,開始 else 分支 print(i+k) # 又增加縮進 print(i) # 這次不但 else 結束了,連內部的 for 也結束了,回退 8 個空格
剛開始,縮進的語法可能讓你搞不清楚,何時縮進,何時回退,該縮進幾個空格。但多
寫寫,多看看,很快就能掌握,并不再犯錯。Python 的縮進語法設計有別與其它所有
的語言,是獨家特色,一直爭論很大,喜歡的非常喜歡,覺得簡潔明了,節省了不少功
夫,而且強制代碼整齊。不喜歡的,覺得縮來縮去,頭都暈了,容易犯語法錯誤,并且
不能使用規格化工具。
同一行寫多條語句:
前面我們說了,Python 一行通常就是一條語句,一條語句通常也不會超過一行。其實,
從語法層面,Python 并沒有完全禁止在一行中使用多條語句,也可以使用分號實現多
條語句在一行,比如:
import sys; x = ‘abc'; y=1
上面這一行其實包含 3 條語句,用分號分隔了,但是強烈建議不要這么做,這樣會導致
代碼閱讀困難、維護耗時,容易出錯,老老實實地用三行來表示,不但更優雅,還增加
了代碼行數,可以跟老板說今天多寫了 2 行,^_^。
多行語句: 前面是多條語句在一行,但如果一條語句實在太長,也是可以占用多行的,
可以使用反斜杠()來實現多行語句:
string = "i love this country,"\ "because it is very beautiful!"\ "how do you think about it?" \ "Do you like it too?"
在 [], {}, 或 () 中的多行語句,可以不需要使用反斜杠(),直接回車,接著寫。例如:
result = subprocess.Popen("ipconfig /all", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, check=True)
建議:每一行的字符不超過 79 個。該換行時咱就換行!
五、空白字符與空白行
空白行、空白字符與代碼縮進不同,并不是 Python 語法的一部分??招谢蛘呖瞻鬃址?/p>
會被當做空氣一樣的忽略。連續的空行或空白字符和單獨的空白行幾字符沒有區別。書
寫時不插入空白行或空白字符,Python 解釋器運行也不會出錯。但是空白的作用在于
分隔兩段不同功能或含義的代碼,便于日后代碼的維護或重構。
PEP8 對于空行留白有專門的建議。
函數之間或類的方法之間用空行分隔,表示一段新的代碼的開始。類和函數入口之間也
用一行空行分隔,以突出函數入口的開始。
變量賦值的時候等號左右各給一個空白。逗號后面跟一個空白。
六、pass 語句
pass 語句是占位語句,它什么都不做,只是為了保證語法的正確性而寫。以下場景中,
可以使用 pass 語句:
當你不知道后面的代碼怎么寫的時候
當你不需要寫代碼細節的時候
當語法必須,又沒有實際內容可寫的時候
其它的一些你覺得需要的場景
例如:
# 我只想說明這個 func 函數需要三個參數,具體執行什么并不重要 # 但是函數體內如果什么都沒有,會出現語法錯誤 # 這個時候,pass 就是最好的選擇。 def func(a,b,c): pass
七、報錯信息
現在,我們已經開始寫一些簡單的 Python 代碼和語句了,犯錯是免不了的,Python 給
我們提供了很全面細致的錯誤調用棧信息,幫助我們查找錯誤。以下面的代碼為例(我
額外給包括空行在內的每一行添加了行號信息):
def foo(s): #1 return 10 / int(s) #2 #3 def bar(s): #4 return foo(s) * 2 #5 #6 def main(): #7 bar('0') #8 #9 main() #10
運行代碼后,會彈出如下的錯誤:
Traceback (most recent call last): File "F:/Python/pycharm/201705/1.py", line 10, in
這些信息就是錯誤提示。我們需要從上往下讀,英文看起來很復雜,其實很易懂。
Traceback…表示追蹤錯誤開始,說在某個位置的 1.py 文件的第 10 行中的 main 這個函
數出了問題。那么問題出在哪呢?是 1.py 文件中的第 8 行的 bar 函數調用出了問題,
那么出什么問題呢?還沒找到根子,又說在第 5 行,第 2 行調用出了問題,然后最終發
現是 return 10 / int(s)這行語句的問題。問題是什么,發生了除零錯誤ZeroDivisionError是一個除零異常。到這里,我們恍然大悟,我讓 10 除 0 了,所以出現錯誤了,那么就
知道怎么改了。
其實查找錯誤,排除錯誤就是這么簡單,只是需要你耐心的一行行地查看錯誤調用棧,再根據最后的錯誤類型,就可以判斷錯誤的發生原因并修改錯誤,沒有想象中的那么復雜。
5G教育 Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。