1. 十分鐘入門(mén) Python 教程

        共 8420字,需瀏覽 17分鐘

         ·

        2021-01-23 18:12

        題記

        去年和 amile 童鞋定了個(gè)小目標(biāo),決定帶著點(diǎn)興趣和熱情,順著全民學(xué) Python 的熱潮,隨波逐流。奈何二零二零年是真的魔幻,唉,生活有你讀不懂的詩(shī),還有到不了的遠(yuǎn)方,我把那一年的辛酸過(guò)往,閹割成了一首詩(shī)?!吧钏埔槐嗖瑁氯缡潘话?,邂逅一縷禪香,無(wú)數(shù)個(gè)赤夜里,抬頭望見(jiàn)新月,繁星點(diǎn)點(diǎn)。“,好像還可以再閹割下,就變成了“苦茶,逝水,禪香,赤夜,新月,繁星”六個(gè)意象。而今,擠擠時(shí)間把這件事進(jìn)行下去吧。。。。。。

        準(zhǔn)備

        本文參考的教材是《Python 教程:從入門(mén)到實(shí)踐》,這本書(shū)比較基礎(chǔ),對(duì)沒(méi)有編程經(jīng)驗(yàn)的讀者異常友好,所以本教程適用于對(duì)剛剛開(kāi)始學(xué)或者沒(méi)有編程經(jīng)驗(yàn)的讀者。使用jupyter notebook作為學(xué)習(xí)這門(mén)語(yǔ)言入門(mén)的工具,這玩意好使,免去了初學(xué)者學(xué)習(xí)編輯器的成本,打開(kāi)網(wǎng)頁(yè)編寫(xiě) Python 程序,點(diǎn)擊運(yùn)行即可出結(jié)果,而且它除了可以寫(xiě) Python 之外,還支持 Markdown 語(yǔ)法,所以很適合寫(xiě)教程和筆記的。關(guān)于它的安裝教程,可以看下這篇文章:https://zhengjiangtao.cn/a2python/base/env.html

        給它一個(gè)特寫(xiě)。


        那個(gè)經(jīng)典的“Hello World”

        在 Python 語(yǔ)言中,我們可以通過(guò)print函數(shù)去打印相關(guān)的信息,比如說(shuō)在 Python3 中我們要打印出一個(gè)Hello World,可以這樣寫(xiě)。

        #?encoding:?utf-8

        if?__name__?==?'__main__':

        ????print('Hello?World')

        基礎(chǔ)知識(shí)梳理

        如樓上的 Hello World 所示,在 Python 語(yǔ)言中,末尾是不用加分號(hào)的。Python 是一門(mén)解釋型,它并不像 C、C++這樣,需要有個(gè)編譯的過(guò)程,將代碼編譯成機(jī)器碼(轉(zhuǎn)換成計(jì)算機(jī)可識(shí)別的二進(jìn)制指令)然后運(yùn)行,在編譯過(guò)程中要確定變量的類型,通不過(guò)編譯就不能運(yùn)行。Python 語(yǔ)言需要一個(gè)解釋器,邊解釋邊運(yùn)行,所以在定義變量的時(shí)候并不需要指出其是什么類型,遵循變量名 = 變量值這種方式即可,關(guān)于變量名的規(guī)范和其它語(yǔ)言也差不多,這里就不展開(kāi)贅述了,后面的相關(guān)類型的變量賦值本身是沒(méi)有什么好講的,但是 Python 語(yǔ)言有意思就有意思在它的庫(kù)多,你不用洋洋灑灑寫(xiě)很多,你只要庫(kù)調(diào)的好,代碼是非常簡(jiǎn)潔的。

        字符串

        比如說(shuō)我們要定義一個(gè)字符串變量名nameataola,就可以寫(xiě)作name = 'ataola'。如果說(shuō)字符串很長(zhǎng),我們期望原樣輸出,那么可以這樣寫(xiě)。

        long_str?=?'''The?Zen?of?Python,?by?Tim?Peters

        Beautiful?is?better?than?ugly.
        Explicit?is?better?than?implicit.
        Simple?is?better?than?complex.
        Complex?is?better?than?complicated.
        Flat?is?better?than?nested.
        Sparse?is?better?than?dense.
        Readability?counts.
        Special?cases?aren't?special?enough?to?break?the?rules.
        Although?practicality?beats?purity.
        Errors?should?never?pass?silently.
        Unless?explicitly?silenced.
        In?the?face?of?ambiguity,?refuse?the?temptation?to?guess.
        There?should?be?one--?and?preferably?only?one?--obvious?way?to?do?it.
        Although?that?way?may?not?be?obvious?at?first?unless?you're?Dutch.
        Now?is?better?than?never.
        Although?never?is?often?better?than?*right*?now.
        If?the?implementation?is?hard?to?explain,?it's?a?bad?idea.
        If?the?implementation?is?easy?to?explain,?it?may?be?a?good?idea.
        Namespaces?are?one?honking?great?idea?--?let's?do?more?of?those!'''


        print(long_str)

        注意: 變量的命名不能跟系統(tǒng)的函數(shù)名,或者保留字沖突,比如這里你寫(xiě)作str = 'what's wrong with you ?'就很不好,因?yàn)?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">str是系統(tǒng)函數(shù),它可以把變量轉(zhuǎn)成字符串類型。例如樓下這個(gè)例子,如果不用str函數(shù)將整型變量age轉(zhuǎn)換成字符串類型的話,就會(huì)出現(xiàn)運(yùn)行出錯(cuò),因?yàn)樗麄儾皇且粋€(gè)類型的變量。

        age?=?24
        msg=?"i?am?"?+?str(age)?+?"?year?old"
        print(msg)

        一些常用的字符串 API

        • title: 首字母大寫(xiě)

        • upper: 大寫(xiě)

        • lower: 小寫(xiě)

        • strip: 去空

        • lstrip: 左邊去空

        • rstrip: 右邊去空

        • split: 字符串轉(zhuǎn)列表

        • count: 統(tǒng)計(jì)字符出現(xiàn)的次數(shù)

        例子 1

        代碼:

        _str?=?'hello?world'
        print('首字母大寫(xiě):',?_str.title())
        print('大寫(xiě):',?_str.upper())
        print('小寫(xiě):',?_str.lower())

        輸出:

        首字母大寫(xiě):?Hello?World
        大寫(xiě):HELLO WORLD
        小寫(xiě):hello world
        例子 2

        代碼:

        _str?=?'?happy?everyday??'
        print('|'?+?_str?+?'|')
        print('|'?+?_str.strip()?+?'|')
        print('|'?+?_str.lstrip()?+?'|')
        print('|'?+?_str.rstrip()?+?'|')
        print('|'?+?_str.lstrip().rstrip()?+?'|')

        輸出:

        |?happy?everyday??|
        |happy?everyday|
        |happy?everyday??|
        |?happy?everyday|
        |happy?everyday|
        例子 3

        代碼:

        bio?=?'day?day?up,?to?be?strong!'
        print(bio.count('day'))
        print(bio.count('up'))

        輸出:

        2
        1

        由例子 2 的最后一行可見(jiàn) Python 是支持函數(shù)鏈?zhǔn)秸{(diào)用的。

        整型

        python3 的整型范圍是無(wú)限的,所以它特別適合拿來(lái)做科學(xué)計(jì)算相關(guān)的,因?yàn)槟悴挥脫?dān)心它會(huì)精度溢出。有意思的是,它允許你用_下劃線表示數(shù)字的分隔符,提高其可讀性,這并不影響其數(shù)值,比如1_000,它和1000是一樣的。

        一些常用處理數(shù)字的 API

        • bin: 轉(zhuǎn)二進(jìn)制

        • abs: 求絕對(duì)值

        • bool: 轉(zhuǎn)布爾值

        • float: 轉(zhuǎn)浮點(diǎn)數(shù)

        • pow: 冪函數(shù)

        • 一些位運(yùn)算。。。。。。

        例子 4

        代碼:

        print(bin(8))?#?十進(jìn)制轉(zhuǎn)二進(jìn)制
        print(abs(-10))?#?絕對(duì)值
        print(?1?and?0?==?1?&?0)?#?按位于
        print?((1?or?0)?==?(1?|?0))?#?按位或
        print(~11?==?-12)#?取反(二進(jìn)制的負(fù)數(shù)表示方法:正數(shù)按位取反再加1)
        print(2?^?3?^?2?==?3)?#?異或
        print(8?<1?==16)?#?左移
        print(8?>>?1?==?4)?#?右移
        print(10?%?3?==?1)?#?取余
        print(3?**?2?==?pow(3,?2))?#?次方運(yùn)算符?和?冪函數(shù)
        print(bool(1)?==?True?)?#?轉(zhuǎn)布爾類型,除0外都是True
        print(bool(0)?==?True?)?#?轉(zhuǎn)布爾類型,除0外都是True
        print(float(100))?#?整數(shù)轉(zhuǎn)浮點(diǎn)

        輸出:

        0b1000
        10
        True
        True
        True
        True
        True
        True
        True
        True
        True
        False
        100.0

        浮點(diǎn)

        為什么0.1 + 0.2 != 0.3, 3 * 0.1 != 0.3, 而是0.30000000000000004?

        我們知道計(jì)算機(jī)只能識(shí)別二進(jìn)制,所以浮點(diǎn)數(shù)會(huì)被轉(zhuǎn)換成二進(jìn)制,0.1 轉(zhuǎn)成二進(jìn)制是0.0001100110011001100110011001100110011001100110011001101, 0.2 轉(zhuǎn)成二進(jìn)制是0.001100110011001100110011001100110011001100110011001101,相加得到的結(jié)果是0.0100110011001100110011001100110011001100110011001101. 簡(jiǎn)單的說(shuō)就是像 0.1 這種無(wú)法被二進(jìn)制完整表示。

        這里我們可以通過(guò)round(num, digits)去使結(jié)果符合預(yù)期,例如print(round(0.1 + 0.2, 1)),就能得到 0.3

        注意:

        十進(jìn)制整數(shù)轉(zhuǎn)二進(jìn)制方法:除 2 取余;十進(jìn)制小數(shù)轉(zhuǎn)二進(jìn)制方法:乘 2 除整

        布爾值

        在 Python 中,用True表示真,用False表示假,注意這里是區(qū)分大小寫(xiě)的。

        我們來(lái)看下面這個(gè)例子

        例子 5

        代碼:

        print(1?==?True)?#?True
        print(0?==?False)?#?False
        print(''?==?True)?#?False
        print('?'?==?True)?#?False
        print(''?==?False)?#?False
        print('?'?==?False)?#?False
        print(bool(''))?#?False
        print(bool('?'))?#?True

        可以看到在 Python 中,數(shù)字 0 也可以表示 False,其它數(shù)字可以表示 True, 而字符串它不能表示成真或假,但是可以通過(guò)bool函數(shù)將其轉(zhuǎn)回成真假

        列表

        列表是一系列按特定順序排列的元素組成,類似于 Javascript 中的數(shù)組。值得一提的是,在列表訪問(wèn)的時(shí)候,它的索引下標(biāo)可以為負(fù)數(shù),例如a[-1]就是表示列表 a 中的倒數(shù)第一個(gè)元素

        一些常用的列表 API

        • sort: 排序

        • reverse: 反轉(zhuǎn)

        • len: 長(zhǎng)度

        • append: 從列表末尾插入元素

        • insert: 列表任意位置插入元素

        • pop: 從列表末尾彈出元素

        • remove: 從右往左移除第一個(gè)遇到的目標(biāo)元素

        我們一起來(lái)看下面這個(gè)例子,

        例子 5

        代碼:

        season??=?['spring',?'summer',?'autumn',?'winter']
        print(season)
        season.sort()
        print(season)
        season.sort(reverse=True)
        print(season)
        print(sorted(season))
        print(season)
        season.reverse()
        print(season)
        print(len(season))

        輸出:

        ['spring',?'summer',?'autumn',?'winter']
        ['autumn',?'spring',?'summer',?'winter']
        ['winter',?'summer',?'spring',?'autumn']
        ['autumn',?'spring',?'summer',?'winter']
        ['winter',?'summer',?'spring',?'autumn']
        ['autumn',?'spring',?'summer',?'winter']
        4

        從樓上的例子,我們不難發(fā)現(xiàn),通過(guò)list.sort(),這種方式它會(huì)改變列表的原值,而且在函數(shù)中可以傳一個(gè)參數(shù)reverse來(lái)表示是順著排序還是倒著排序。

        我們?cè)賮?lái)看一個(gè)例子

        例子 6

        代碼:

        arr?=?[1,?2,?3,?4,?5]
        print(arr[0])
        print(arr[-1])
        arr.append(6)
        print(arr)
        arr.insert(4,?4.5)
        print(arr)
        del?arr[4]
        print(arr)
        arr.pop()
        print(arr)
        arr.pop(2)
        print(arr)
        arr.remove(4)
        print(arr)

        輸出:

        1
        5
        [1,?2,?3,?4,?5,?6]
        [1,?2,?3,?4,?4.5,?5,?6]
        [1,?2,?3,?4,?5,?6]
        [1,?2,?3,?4,?5]
        [1,?2,?4,?5]
        [1,?2,?5]

        樓上的例子首先我定義了一個(gè)列表arr = [1, 2, 3, 4, 5],然后我去訪問(wèn)了它的第一個(gè)元素和最后一個(gè)元素,接著我通過(guò)append函數(shù)在列表后面追加了6,之后我又通過(guò)insert函數(shù)在第五個(gè)元素的位置插入了4.5,緊接著我用del又把它刪除了,然后我通過(guò)調(diào)用pop彈出了列表最后的元素,之后我又給它穿了個(gè)參數(shù)2,表示將第三個(gè)元素彈出,最后我通過(guò)remove函數(shù)去刪除了從列表最后往前找到的第一個(gè)目標(biāo)元素。

        字典

        字典是一系列的鍵值對(duì),類似于 JavaScript 中的對(duì)象。我們還是以具體的示例來(lái)看下。

        例子 7

        代碼:

        user?={?'name':?'ataola',?'age':?24,?'sex':?'男'?}
        print(user)
        print('Hello?',?user['name'])

        輸出:

        {'name':?'ataola',?'age':?24,?'sex':?'男'}
        Hello??ataola

        這里我們定義了一個(gè)用戶信息的字典,然后試著把它打印出來(lái),通過(guò)鍵值對(duì)的鍵可以訪問(wèn)它的值,接著我們?cè)囍鴺?gòu)造字符串去試著訪問(wèn)它。

        例子 8

        代碼:

        for?key,?value?in?user.items():
        ????print(key,?value)

        輸出:

        name?ataola
        age?24
        sex?男

        上面這個(gè)例子就是遍歷字典的鍵值對(duì)的方法。

        如果我只是想遍歷它的鍵或者值呢?通過(guò)keys()表示鍵,通過(guò)values()表示值。

        代碼:

        for?key?in?user.keys():
        ????print(key)

        輸出:

        name
        age
        sex

        代碼:

        for?value?in?user.values():
        ????print(value)

        輸出:

        ataola
        24

        這里再進(jìn)一步思考下,如果說(shuō)我遍歷的值有很多重復(fù)呢?我怎么讓它不重復(fù)呢?嗯,對(duì),答案就是集合去重。當(dāng)然,這里答案不唯一。

        代碼:

        favorite_language?=?{?'alice':?'JAVA',?'Bob':?'C++',?'ataola':?'Javascript',?'daming':?'Javascript',?'wuyifan':?'Javascript'?}
        for?value?in?set(favorite_language.values()):
        ????print(value)

        輸出:

        JAVA
        Javascript
        C++

        循環(huán)和判斷

        這里把循環(huán)和判斷放在一起講吧,循環(huán)在大多數(shù)編程語(yǔ)言里都差不多,不外乎for循環(huán)和while循環(huán),條件判斷也都類似,不外乎if,else這種。

        while 循環(huán)

        代碼:

        while?message?!=?'quit':
        ????message?=?input('please?input?something:')
        ????print(message)

        輸出:

        please?input?something:11
        11
        please?input?something:22
        22
        please?input?something:33
        33
        please?input?something:quit
        quit

        這個(gè)程序是這樣子的,當(dāng)用戶輸入quit的時(shí)候,那么我就退出這個(gè)程序,不然我就原樣輸出。

        條件判斷

        代碼:

        num?=?input('please?input?a?number:?')
        num?=?int(num)
        if?num?>?10:
        ????print('big')
        elif?num?<=?10?and?num?>?5:
        ????print('normal')
        else:
        ????print('small')

        輸出:

        please?input?a?number:?8
        normal

        這個(gè)程序是這樣子的,提示用戶輸入一個(gè)數(shù),然后判斷這個(gè)數(shù)的大小,通過(guò)if,elif,else來(lái)判斷輸入的數(shù)是大還是小,抑或是正常,這就是個(gè)例子,本身沒(méi)有什么意義。

        for 循環(huán)

        代碼:

        numbers?=?list(range(1,?20))
        for?num?in?numbers:
        ????if?num?%?2?==?0:
        ????????print(num,?'是個(gè)偶數(shù)')
        ????else:
        ????????print(num,?'是個(gè)奇數(shù)')
        print(numbers)

        輸出:

        1?是個(gè)奇數(shù)
        2?是個(gè)偶數(shù)
        3?是個(gè)奇數(shù)
        4?是個(gè)偶數(shù)
        5?是個(gè)奇數(shù)
        6?是個(gè)偶數(shù)
        7?是個(gè)奇數(shù)
        8?是個(gè)偶數(shù)
        9?是個(gè)奇數(shù)
        10?是個(gè)偶數(shù)
        11?是個(gè)奇數(shù)
        12?是個(gè)偶數(shù)
        13?是個(gè)奇數(shù)
        14?是個(gè)偶數(shù)
        15?是個(gè)奇數(shù)
        16?是個(gè)偶數(shù)
        17?是個(gè)奇數(shù)
        18?是個(gè)偶數(shù)
        19?是個(gè)奇數(shù)
        [1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,?16,?17,?18,?19]

        樓上的這個(gè)例子,我們用了一個(gè) for 循環(huán)遍歷了列表 numbers 里面的項(xiàng),然后結(jié)合 if 判斷這個(gè)項(xiàng)是奇數(shù)還是偶數(shù)。

        函數(shù)

        函數(shù)本質(zhì)是帶名字的代碼段,在 python 中我們可以通過(guò)def去定義一個(gè)函數(shù)。

        代碼:

        def?sayHello(name?=?'zjt'):
        ????return?'hello?'?+?name

        for?i?in?range(1,?10):
        ????if?i?%?2?==?0:
        ????????print(i,?sayHello())
        ????else:
        ????????print(i,?sayHello('ataola'))

        輸出

        1?hello?ataola
        2?hello?zjt
        3?hello?ataola
        4?hello?zjt
        5?hello?ataola
        6?hello?zjt
        7?hello?ataola
        8?hello?zjt
        9?hello?ataola

        上面這個(gè)例子中我們定義了一個(gè)函數(shù)sayHello,然后給函數(shù)的形參一個(gè)初始值,如果調(diào)用函數(shù)沒(méi)有傳的話就取默認(rèn)值,這個(gè)例子本身沒(méi)有什么意義,就作為演示意思下。

        講到類,就不得不提面向?qū)ο罅?,以及封裝繼承多態(tài)啦。這里我們作為入門(mén)環(huán)節(jié),簡(jiǎn)單地用一個(gè)例子感受下。

        我們先創(chuàng)建一個(gè)類Person,然后我們?cè)賱?chuàng)建一個(gè)類Robot去繼承Person.

        代碼:

        class?Person():
        ????"""?人類?"""
        ????def?__init__(self,?name,?age):
        ????????self.name?=?name
        ????????self.age?=?age
        ????def?speak(self):
        ????????print(self.name.title(),?'?is?speaking.')

        class?Robot(Person):
        ????def?__init__(self,?name,?age):
        ????????super().__init__(name,?age)


        ataola?=?Person('zheng?jiangtao',?24)
        ataola.speak()
        robot?=?Robot('xiao?ai',?3)
        robot.speak()

        輸出:

        Zheng?Jiangtao??is?speaking.
        Xiao?Ai??is?speaking.

        我們實(shí)例化了一個(gè) Person 類 ataola,然后調(diào)用了 speak 方法,我們還實(shí)例化了一個(gè) Robot 類,然后調(diào)用了其繼承 Person 類的 speak 方法。

        說(shuō)明

        本文首發(fā)于 GitHub 倉(cāng)庫(kù)https://github.com/ataola/a2python,線上閱讀地址:https://zhengjiangtao.cn/a2python/,轉(zhuǎn)載請(qǐng)注明出處,謝謝!


        瀏覽 39
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 久操国产视频 | 国产精品成人AV电影 | 亚洲熟女乱Aⅴ | 视频一区在线 | 黑鸡巴视频 |