主頁 > 後端開發 > day_02~day_09的Python語法基礎

day_02~day_09的Python語法基礎

2020-10-01 16:26:33 後端開發

Python基礎學習

day_02

  • 使用方法修改字串的大小寫

將字串首字母變成大寫

>>> name = "ada lovelace"
>>> print(name.title())
Ada Lovelace

將字串全部變成大寫

>>> print(name.upper())
ADA LOVELACE

將字串全部變成小寫

>>> print(name.lower())
ada lovelace
  • 合并字串

使用 + 來合并 first_name,last_name,空格

>>> first_name = "ada"
>>> last_name = "lovelace"
>>> full_name = first_name + " " +last_name
>>> print(full_name)
ada lovelace

乘熱打鐵,使用title()來組裝一個字串

>>> print("Hello,"+ " " + full_name.title() +"!")
Hello, Ada Lovelace!

也可以將整條資訊儲存在一個變數中

>>> message = "Hello,"+ " " + full_name.title() +"!"
>>> print(message)
Hello, Ada Lovelace!
  • 使用制表符或換行符來添加空白

在字符中添加制表符,可以使用字符組合\t

>>> print("Python")
Python
>>> print("\tPython")
	Python

在字符中添加換行符,可以使用字符組合\n

>>> print("I\nlove\nPython")
I
love
Python

使用換行符加上制表符

>>> print("I\n\tlove\n\tPython")
I
	love
	Python
  • 洗掉空白

使用方法rstrip(),這種方法只是暫時的

>>> a_word = 'python '
>>> a_word
'python '  #輸入的時候有一個空格符
>>> a_word.rstrip()
'python'   #消除了空白
>>> a_word
'python ' 

要想永久洗掉空格,還需將洗掉的操作重新賦值到原來的變數里面

>>> a_word = a_word.rstrip()
>>> a_word
'python'

rstrip()剔除右邊的空白

lstrip()剔除左邊的空白

strip()剔除全部空白

>>> a_word = ' python '  #左邊和右邊都有空白
>>> a_word.rstrip()
' python'
>>> a_word.lstrip()
'python '
>>> a_word.strip()
'python'
  • 使用字串是避免語法錯誤

撇號位于兩個雙引號之間,故能識別出整個字串

>>> message = "I'm a student."
>>> print(message)
I'm a student.

但是使用單引號時

>>> message = 'I'm a student.'
SyntaxError: invalid syntax

Python無法正確地確定字串結束的位置

  • 數字

整數

在Python中可以對整數進行+ - * / 運算

>>> 1+1
2
>>> 3-5
-2
>>> 3-2
1
>>> 3/2
1.5
>>> 8*9
72

Python使用兩個乘號(**)進行乘方運算

>>> 8*9
72
>>> 3**3
27
>>> 2**3
8
>>> 5**5
3125

浮點數

使用浮點數是無需考慮其他行為,只需輸入要使用的數字

>>> 1.2+5
6.2
>>> 1.2+36.3
37.5
>>> 1.7+9.6
11.299999999999999
>>> 1.6+1.6
3.2
>>> 0.2+0.1
0.30000000000000004
>>> 2*0.2
0.4
>>> 1*0.3
0.3

有時結果包含的小數點是不確定的

但是無需擔心,接下來的學習中會解決此類問題

  • 使用函式str()避免型別錯誤

有時候你希望

>>> age = 22
>>> message = "Happy" + " " + age +"rd Birthday!!"

你會希望輸出"Happy 22rd Byrthday!!"

但是,很遺憾上述代碼會引發錯誤

>>> age = 22
>>> message = "Happy" + " " + age  +"rd Birthday!!"
Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    message = "Happy" + " " + age  +"rd Birthday!!"
TypeError: can only concatenate str (not "int") to str

這是一個型別錯誤,Python發現你使用了一個值為整數(int)的值,它不知道如何解讀這個值,它認為這個變數表達的可能是22,也可能是字符2和字符2,為此,在呼叫變數是,你需要呼叫str()函式來將這個變數變成字串,

>>>age = 22
>>> message = "Happy" + " " + str(age) + "rd Birthday!!"
>>> print(message)
Happy 22rd Birthday!!
  • python之禪

在IDLE中運行import this就可以得到Python之禪

>>> import this
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!

以上就是Python第二天的學習內容,希望能對你有所幫助,祝你學有所成!!!

day_03

  • 串列是什么

在Python中,用[]來表示串列,并用逗號來分隔其中的元素,下面是一個簡單的串列示例:

>>> bicycles = ['treak','cannondale','redline','specialized']
>>> print(bicycles)

Python會將串列列印出來,包括方括號

['treak', 'cannondale', 'redline', 'specialized']
  • 訪問串列元素

利用[]來訪問串列中的元素

>>> print(bicycles[0])
treak

上條陳述句利用了bicycles[0]來訪問串列中的第一個元素

我可以使用昨天所講的字串方法,來使輸出更加簡潔——使用title()方法:

>>> print(bicycles[0].title())
Treak
  • 索引是從0開始而不是從1開始

你可以看到

>>> bicycles = ['treak','cannondale','redline','specialized']
>>> print(bicycles[1])
cannondale
>>> print(bicycles[3])
specialized

下標為1的元素是cannondale、下標為3的元素是specialized

通過訪問[-1]可以得到最后一個串列元素

>>> bicycles = ['treak','cannondale','redline','specialized']
>>> print(bicycles[-1])
specialized

同理訪問[-2]得到倒數第二個元素,[-3]倒數第三個元素

  • 使用串列中的各個值

下面來嘗試提取一款自行車,并使用這個值來創建一條資訊:

>>> message = "My first bicycles was a "+bicycles[1].title() + "."
>>> print(message)
My first bicycles was a Cannondale.
  • 修改串列元素

例如,假設有一個動物串列,其中第一個元素是'tiger' ,如何修改它的值呢?

>>> animal = ['tiger','bird','fox']
>>> print(animal)
['tiger', 'bird', 'fox']

>>> animal[0] = 'monkey'
>>> print(animal)
['monkey', 'bird', 'fox']
  • 在串列中添加元素

使用方法append()添加元素

>>> animal.append('fish')
>>> print(animal)
['monkey', 'bird', 'fox', 'fish']

這樣就在串列中添加了一個函式

你還可以建立一個空串列,將元素一個一個地添加進去

>>> fruits = []

>>> fruits.append('apple')
>>> fruits.append('banana')
>>> fruits.append('cherry')
>>> print(fruits)

得到的結果是

['apple', 'banana', 'cherry']

但是使用這種方法添加的函式永遠是在最后一個

為此你需要一個可以插入元素的方法

使用insert()方法可以在串列的任何位置添加新的元素,為此,你需要指定新元素的索引和值:

>>> fruits.insert(0,'lemon')
>>> print(fruits)

使用這個方法,'lemon' 被插入到串列開頭,這種操作將串列中所有的元素都右移一個位置

['lemon', 'apple', 'banana', 'cherry']
  • 在串列中洗掉元素

使用del陳述句洗掉元素

使用del陳述句的前提是,知道需要洗掉的元素的位置

>>> fruits = ['apple','banana','orange']
>>> print(fruits)
['apple', 'banana', 'orange']
>>> del fruits[0]
>>> print(fruits)
['banana', 'orange']

使用del陳述句洗掉了,串列中的第一個元素

['apple', 'banana', 'orange']
['banana', 'orange']

使用del可以洗掉任何位置的串列元素,條件是知道索引

使用方法pop()洗掉元素

方法pop()可洗掉串列末尾的元素,并讓你能夠接著使用他

>>> fruits = ['apple','banana','orange']
>>> print(fruits)
['apple', 'banana', 'orange']

>>> popend_fruits = fruits.pop()
>>> print(fruits)
['apple', 'banana']
>>> print(popend_fruits)
orange

如果水果是按時間購買的,我想知道最后購買的水果是哪一種?

>>> fruits = ['apple','banana','orange']
>>> print(fruits)
['apple', 'banana', 'orange']

>>> last_buy = fruits.pop()
>>> print("我最后買的水果是" + last_buy.title())
我最后買的水果是Orange

彈出串列中任何位置處的元素

實際上,可以使用pop()來彈出串列中的任何元素,只需在括號中指定要洗掉元素的索引即可

>>> fruits = ['apple','banana','orange']
>>> print(fruits)
['apple', 'banana', 'orange']

>>> second_fruits = fruits.pop(1)
>>> print(second_fruits)
apple

有時候,你不知帶元素在串列中的位置,如果你只知道要洗掉的元素的值,可以使用方法remove()

假設,我們要從串列中洗掉值 ‘apple’

>>> fruits = ['apple','banana','orange']
>>> print(fruits)
['apple', 'banana', 'orange']

>>> fruits.remove('apple')
>>> print(fruits)
['orange', 'banana']

使用remove()讓Python知道'apple'出現在什么位置,并將元素洗掉

? 動手試一試

嘉賓名單:如果你可以邀請任何人一起共進晚餐,你會邀請哪些人?請創建一個串列,其中包含至少3個你想邀請的人;然后,使用這個串列列印資訊,邀請這些人來與你共進晚餐,

#嘉賓名單
guest = ['Harry','Ben','Babo','Jack']
for i in range(0,4):
     print("我想邀請"+guest[i].title()+"來與我共進晚餐,")
        
我想邀請Harry來與我共進晚餐,
我想邀請Ben來與我共進晚餐,
我想邀請Babo來與我共進晚餐,
我想邀請Jack來與我共進晚餐,
guest = ['Harry','Ben','Babo','Jack']
print("我想邀請"+guest[0].title()+"," +guest[1].title() +","+guest[2].title() +","+guest[3].title()+"來與我共進晚餐,")

我想邀請Harry,Ben,Babo,Jack來與我共進晚餐,

修改嘉賓名單:你剛剛得知有位嘉賓無法赴約,因此需要邀請另外一名嘉賓

#嘉賓名單
guest = ['Harry','Ben','Babo','Jack']
guest.remove('Babo')
guest.insert(2,'Mical')
print("我想邀請"+guest[0].title()+"," +guest[1].title() +","+guest[2].title() +","+guest[3].title()+"來與我共進晚餐,")

我想邀請Harry,Ben,Mical,Jack來與我共進晚餐,

添加嘉賓:你找到了一個更大的餐桌,可以容納更多的嘉賓,請再邀請多三個嘉賓

  • 使用insert()在邀請名單的開頭和中間添加一名嘉賓
  • 使用append()將最后一名新嘉賓添加到名單末尾
  • 列印一條資訊,向名單中的每位嘉賓發出邀請
guest = ['Harry','Ben','Babo','Jack']
guest.remove('Babo')
guest.insert(2,'Mical')
guest.insert(0,'Batman')
guest.insert(2,'Ironman')
guest.append('Superman')
for i in range(0,8):
    print("我想邀請"+guest[i].title()+"來與我共進晚餐,")
    
    
我想邀請Batman來與我共進晚餐,
我想邀請Harry來與我共進晚餐,
我想邀請Ironman來與我共進晚餐,
我想邀請Ben來與我共進晚餐,
我想邀請Mical來與我共進晚餐,
我想邀請Jack來與我共進晚餐,
我想邀請Superman來與我共進晚餐,

縮減名單:你剛得知新購買的餐桌無法按時到達,因此只能邀請兩名嘉賓

  • 在程式末尾列印你只能邀請兩名嘉賓的資訊
  • 使用pop()不斷地洗掉名單中的嘉賓,直到只剩下兩名嘉賓,每次從名單中彈出一名嘉賓是,都列印一條資訊,讓該嘉賓知道的情況,無法與你共進晚餐
  • 對于剩下的兩位嘉賓,列印一份資訊,告知他們仍然在邀請的嘉賓之列
guest = ['Harry','Ben','Babo','Jack']
guest.remove('Babo')
guest.insert(2,'Mical')
guest.insert(0,'Batman')
guest.insert(2,'Ironman')
guest.append('Superman')

print("非常抱歉,因為餐桌的原因,我只能邀請三個人來參加我的晚餐"+"\n\n")

one_guest = guest.pop()
print("非常抱歉"+ one_guest+"不能邀請你來我的晚餐")
two_guest = guest.pop()
print("非常抱歉"+ two_guest+"不能邀請你來我的晚餐")
three_guest = guest.pop()
print("非常抱歉"+ three_guest+"不能邀請你來我的晚餐")
four_guest = guest.pop()
print("非常抱歉"+ four_guest+"不能邀請你來我的晚餐"  + "\n\n")
for i in range(0,4):
    print("你好"+guest[i].title()+"你仍然在我的嘉賓之列,")

非常抱歉,因為餐桌的原因,我只能邀請三個人來參加我的晚餐


非常抱歉Superman不能邀請你來我的晚餐
非常抱歉Jack不能邀請你來我的晚餐
非常抱歉Mical不能邀請你來我的晚餐
非常抱歉Ben不能邀請你來我的晚餐


你好Batman你仍然在我的嘉賓之列,
你好Harry你仍然在我的嘉賓之列,
你好Ironman你仍然在我的嘉賓之列,
  • 組織串列

在你創建的串列單中,元素的排列通常是無法預測的,因為你并非總能控制用戶提供的資料,

使用方法sort()對串列進行永久性排序

Python中的sort()方法能較為輕松地對串列進行排序,假設你有一個汽車串列,并讓其中的汽車按字母順序排序,

cars = ['bmw','audi','fengtian','dazhong']
cars.sort()
print(cars)


['audi', 'bmw', 'dazhong', 'fengtian']

你還可以按照字母逆序排序,只需要向sort()方法傳遞引數reverse=True

cars = ['bmw','audi','fengtian','dazhong']
cars.sort(reverse=True)
print(cars)


['fengtian', 'dazhong', 'bmw', 'audi']

使用函式sorted()對串列進行臨時排序

如果你想保留原來的串列,你可以使用函式sorted()對串列進行臨時排序

cars = ['bmw','audi','fengtian','dazhong']
print("使用函式sorted()進行排列的串列")
print(sorted(cars))

print("原來的串列")
print(cars)

使用函式sorted()進行排列的串列
['audi', 'bmw', 'dazhong', 'fengtian']
原來的串列
['bmw', 'audi', 'fengtian', 'dazhong']

倒著列印串列

可使用方法reverse(),假設汽車是按照購買時間排列的,可以輕松地按照相反的順序排列其中的汽車

cars = ['bmw','audi','fengtian','dazhong']
print("原來的串列")
print(cars)

print("按照購買時間的順序逆序")
cars.reverse()
print(cars)

原來的串列
['bmw', 'audi', 'fengtian', 'dazhong']
按照購買時間的順序逆序
['dazhong', 'fengtian', 'audi', 'bmw']

確定串列的長度——使用len()函式

print("該串列的長度")
print(len(cars))

該串列的長度
4

day_04

  • 遍歷整個串列

我們創建串列時,需要輸出整個串列,但是通常串列會很長,包含很多元素,當串列長度發生變化是,都必須修改代碼,通過for回圈,我們可以很輕易地輸出整個串列,

#遍歷整個串列  創建一個水果串列
fruits = ['apple','orange','banana','cherry']
for i in fruits:
    print(i)
apple
orange
banana
cherry
  • 在for回圈中執行更多的操作

對每個水果都列印一份資訊,表示我太喜歡吃這個水果了

fruits = ['apple','orange','banana','cherry']
for i in fruits:
    print("我真的太喜歡吃,"+i.title()+"這個水果了,")
    print("我每天都要吃"+i.title()+".\n")
我真的太喜歡吃,Apple這個水果了,
我每天都要吃Apple.

我真的太喜歡吃,Orange這個水果了,
我每天都要吃Orange.

我真的太喜歡吃,Banana這個水果了,
我每天都要吃Banana.

我真的太喜歡吃,Cherry這個水果了,
我每天都要吃Cherry.
  • 在for回圈結束后執行一些操作

在for回圈結束后列印一條陳述句,應在for回圈的外面列印‘’

fruits = ['apple','orange','banana','cherry']
for i in fruits:
    print("我真的太喜歡吃,"+i.title()+"這個水果了,")
    print("我每天都要吃"+i.title()+".\n")

print("我明天就去買!!!!")
我真的太喜歡吃,Apple這個水果了,
我每天都要吃Apple.

我真的太喜歡吃,Orange這個水果了,
我每天都要吃Orange.

我真的太喜歡吃,Banana這個水果了,
我每天都要吃Banana.

我真的太喜歡吃,Cherry這個水果了,
我每天都要吃Cherry.

我明天就去買!!!!
  • 避免縮進錯誤
  1. 忘記縮進,在for陳述句中記得在for陳述句代碼最后有一個冒號: 將其遺漏可以會造成縮進錯誤

  2. 忘記縮進額外的代碼

  3. 不必要的縮進

    message = "python"
    	print(message)#print不屬于前一行代碼,他們是平等的關系,所以不需要縮進
    
  4. 回圈后的不必要縮進 例如:回圈內的代碼需要縮進,代碼結束后代碼不需要縮進

  • 創建數字串列

使用函式range()

Python函式range()能幫你輕松地生成一系列的數字

for i in range(0,5):
	print(i)
0
1
2
3
4

range()生成從第一個數開始到第二個數的前一個值結束

使用range()創建數字串列

number_list = list(range(0,7))
print(number_list)

[0, 1, 2, 3, 4, 5, 6]

使用range()時,還可以指定步長

number_list = list(range(0,20,2))
print(number_list)

步長為2時,輸出所有偶數

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

創建臨時變數square(),將每個計算得到的值附加到串列快的末尾:

square = []
for i in range(1,11):
    ad = i**2
    square.append(ad)
print(square)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

對數字串列進行簡單的統計

找出串列中的最小值min()、最大值max()、總和sum()

square = []
for i in range(1,11):
    ad = i**2
    square.append(ad)
print(square)
print(min(square),max(square),sum(square))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
1 100 385   #輸出了串列中的最小值、最大值、總和

串列決議

使用一行代碼就完成對串列的平方

square = [i**2 for i in range(1,11)]
print(square)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  • 使用串列的一部分

切片

控制需要輸出串列的元素

fruits = ['lemon','apple','banana','orange']
print(fruits[0:3])
['lemon', 'apple', 'banana']

輸出了前三種水果

是可以生成任何子集,例如“你需要提取第2~3個元素;可以將起始索引指定為1,末尾索引指定為4

fruits = ['lemon','apple','banana','orange']
print(fruits[1:3])
['apple', 'banana']

沒有指定第一個索引的情況

fruits = ['lemon','apple','banana','orange']
print(fruits[:3])
['lemon', 'apple', 'banana']

沒有指定最后一個索引的情況

fruits = ['lemon','apple','banana','orange']
print(fruits[1:])
['apple', 'banana', 'orange']

遍歷切片

如果需要遍歷一部分串列元素,可以使用for回圈中使用切片,在下面串列中我們遍歷前三種水果

fruits = ['lemon','apple','banana','orange']
print("遍歷前三種水果")
for i in fruits[:3]:
    print(i.title())
遍歷前三種水果
Lemon
Apple
Banana

復制串列

你喜歡的水果,你的朋友也喜歡,需要將你喜歡的水果串列復制,然后賦值給你朋友的水果串列

fruits = ['lemon','apple','banana','orange']
friend_fruits = fruits[:]

print("我喜歡的水果")
print(fruits)
print("\n我朋友喜歡的水果")
print(friend_fruits)
我喜歡的水果
['lemon', 'apple', 'banana', 'orange']

我朋友喜歡的水果
['lemon', 'apple', 'banana', 'orange']
  • 元組

創建一個不可修改的的串列——元組

定義元組

元組與串列類似,串列使用[]來進行定義,元組使用()進行定義

例如:有一個大小不應改變的矩形,可以將其長度寬度存盤在一個元組中,從而確保他們是不能修改的

message =(100,90)
print(message[0])
print(message[1])
100
90

像串列一樣,元組也能遍歷其中的所有值

message =(100,90)
for i in message:
    print(i)
100
90

雖然不能修改元組的值,但是可以向元組中的元素賦值

message =(100,90)
print("原來的值")
for i in message:
    print(i)


message =(400,500)
print("\n賦值后的值")
for i in message:
    print(i)
原來的值
100
90

賦值后的值
400
500

以上就是Python基礎學習第四天的內容,

  • 在for回圈中執行更多的操作

對每個水果都列印一份資訊,表示我太喜歡吃這個水果了

fruits = ['apple','orange','banana','cherry']
for i in fruits:
    print("我真的太喜歡吃,"+i.title()+"這個水果了,")
    print("我每天都要吃"+i.title()+".\n")
我真的太喜歡吃,Apple這個水果了,
我每天都要吃Apple.

我真的太喜歡吃,Orange這個水果了,
我每天都要吃Orange.

我真的太喜歡吃,Banana這個水果了,
我每天都要吃Banana.

我真的太喜歡吃,Cherry這個水果了,
我每天都要吃Cherry.

day_05

if陳述句

一個簡單的示例

cars =['audo','bwm','benchi','toyota']
for i in cars:
    if i=='bwm':
        print(i.upper())
    else:
        print(i.title())

判斷串列當中有沒有'bmw' 如果有的話,就以全大寫的方式列印出來,否則的話,以首字母大寫的方式列印出來,

Audo
BWM
Benchi
Toyota
  • 條件測驗

每條if陳述句核心都是一個值為True和false的運算式,這種運算式杯稱為條件測驗,Python根據條件測驗的值為True還是false來決定是否執行if陳述句中的代碼,

檢查特定的值是否包含在串列中

要判定特定的值是否已經在串列中,可以使用關鍵字in,

>>> aminal = ['lion','tiger','birl','monkey']
>>> 'lion' in aminal
True
>>> 'fish' in aminal
False

檢查特定的值是否不包含在串列中

aminal = ['lion','tiger','birl','monkey']
aaa = 'fish'
if aaa not in aminal:
     print(aaa.title()+"不在動物串列中")
Fish不在動物串列中
  • 省略else陳述句塊

else是一條包羅萬象的陳述句,只要不滿足任何if或者elif中的條件測驗,其中的代碼就會執行,這可能會引入無效甚至是惡意的資料,如果知道最終要測驗的條件,應考慮使用一個elif代碼來代替else代碼塊,這樣,你就可以肯定,僅當滿足相應條件時,你的代碼才會運行,

  • 測驗多個條件

if-elif-else: 結構功能強大,但是僅適合一個條件滿足的情況:遇到通過了的測驗后,Python就跳過余下的測驗,這種行為很好,效率很高,讓你能夠測驗一個特定的條件,

然而,有些時候必須檢查你關心的所有條件,在這種情況下,應使用一種不包含elif 和else的代碼塊的簡單if陳述句,這種方法適合于 ,有多個條件都為true,且需要在每個true條件下執行相關的操作,

essage = ['mushroom','tea','buger','dumpling']

if 'dumpling' in essage:
    print("有客人點餐dumpling")
if 'tea' in essage:
    print("有客人點餐tea")
if 'apple' in essage:
    print("有客人點餐apple")

print("\n點餐完畢")
有客人點餐dumpling
有客人點餐tea

點餐完畢

如果使用if-elif-else陳述句,代碼將不能正確地運行,因為有一個測驗通過后,就會跳過余下測驗:

essage = ['mushroom','tea','buger','dumpling']

if 'dumpling' in essage:
    print("有客人點餐dumpling")
elif 'tea' in essage:
    print("有客人點餐tea")
elif 'apple' in essage:
    print("有客人點餐apple")
    
print("\n點餐完畢")
有客人點餐dumpling

點餐完畢
  • 使用if陳述句處理串列

檢查特殊元素

繼續使用前面的例子,這家餐廳在制作時,客人每次點一道菜都列印一條資訊,通過創建一個串列,并使用一個回圈來列印出客人點的菜:

essage = ['mushroom','tea','buger','dumpling']
for i in essage:
    print("有客人點餐"+i.title())
print("\n點餐完畢")
有客人點餐Mushroom
有客人點餐Tea
有客人點餐Buger
有客人點餐Dumpling

點餐完畢

輸出很簡單,上述代碼不過是一個簡單的foe陳述句

然而,如果餐廳的茶用完了,該如何處理呢?

essage = ['mushroom','tea','buger','dumpling']
for i in essage:
    if i == 'tea':
        print("不好意思,店里沒有tea")
    else:
        print("有客人點餐"+i.title())
print("\n點餐完畢")
有客人點餐Mushroom
不好意思,店里沒有tea
有客人點餐Buger
有客人點餐Dumpling

點餐完畢

?

day_06(字典)

  • 一個簡單的字典

創建一個外星人字典

alien_0 = {'color':'green','points':5,'X_position':4,'Y_position':5,'speed':'unknow'}
print(alien_0['color'])
print(alien_0['points'])

new_color = alien_0['color']
new_points = alien_0['points']
print("恭喜,你擊敗了一個"+ new_color +"外星人,獲得了"+str(new_points) +"個點數,")
  • 添加鍵值對
alien_0['X_position'] = 4
alien_0['Y_position'] = 5
print(alien_0)
  • 修改字典中的值
print("外星人現在的顏色是:"+alien_0['color'])

alien_0 = {'color':'red'}
print("外星人現在的顏色是:"+alien_0['color'])
  • 改變外星人的移動位置
alien_0 = {'color':'green','points':5,'X_position':4,'Y_position':5,'speed':'unknow'}

#外星人的原始坐標
print("外星人的位置("+ str(alien_0['X_position']) +","+ str(alien_0['Y_position']) +")" )
add_number = 0
for i in range(10):
    if alien_0['speed'] == 0:
        add_number+=1
    elif alien_0['speed']  == 'unknow':
        add_number+=2
    else:
        add_number+=3
    
#新位置等于老位置加上增量
    alien_0['X_position'] = alien_0['X_position'] + add_number
    alien_0['Y_position'] = alien_0['Y_position'] + add_number
    print("現在外星人的坐標是("+ str(alien_0['X_position']) +","+ str(alien_0['Y_position']) +")")
外星人的位置(4,5)
現在外星人的坐標是(6,7)
現在外星人的坐標是(10,11)
現在外星人的坐標是(16,17)
現在外星人的坐標是(24,25)
現在外星人的坐標是(34,35)
現在外星人的坐標是(46,47)
現在外星人的坐標是(60,61)
現在外星人的坐標是(76,77)
現在外星人的坐標是(94,95)
現在外星人的坐標是(114,115)
  • 洗掉鍵值對

對于字典中不再需要的值,可以使用del陳述句將相應的鍵值對徹底洗掉,使用del陳述句時,必須指定字典名和要洗掉的鍵,

下面的代碼中,將alien_0中洗掉鍵'points' 及其值:

alien_0 = {'color':'green','points':5,'X_position':4,'Y_position':5,'speed':'unknow'}
print(alien_0)

del alien_0['points']
print(alien_0)

{'color': 'green', 'points': 5, 'X_position': 4, 'Y_position': 5, 'speed': 'unknow'}
{'color': 'green', 'X_position': 4, 'Y_position': 5, 'speed': 'unknow'}

洗掉的鍵值對,永遠消失

  • 由類似物件組成的字典

利用字典存盤多個鍵值對時,可以使用以下的格式:

favorite_language = {
    'herry':'java',
    'mical':'python',
    'jun':'ruby',
    'lily':'C'
    }
print("herry最喜歡的語言是:"+ favorite_language['herry'].title())
herry最喜歡的語言是:Java

這個示例演示了如何將較長的print陳述句分成多行,

  • 遍歷字典

遍歷所有的鍵值對

下面的字典中存盤了一名用戶的用戶名、名和姓:

user_0= {
    'user_name':'GHP',
    'first':'G',
    'last':'P'
    }
for key,value in user_0.items():  #利用兩個變數分別存盤鍵和值
    print('\n鍵: '+key)
    print('值: '+value)

可以使用for來遍歷字典

鍵: user_name
值: GHP

鍵: first
值: G

鍵: last
值: P
  • 遍歷字典中所有的鍵
user_0= {
    'user_name':'GHP',
    'first':'G',
    'last':'P'
    }
for name in user_0.keys():
    print(name.title())

User_Name
First
Last

創建一個串列,使用串列中的值來遍歷字典

favorite_language = {
    'herry':'java',
    'mical':'python',
    'jun':'ruby',
    'lily':'C'
    }
friends = ['herry','mical']
for name in favorite_language.keys():
    print(name.title())

    if name in friends:
        print("你好," + name.title() + "我知道你最喜歡的語言是" + favorite_language[name].title())
Herry
你好,Herry我知道你最喜歡的語言是Java
Mical
你好,Mical我知道你最喜歡的語言是Python
Jun
Lily

按照順序遍歷字典中的所有鍵

字典總是明確的記錄鍵之間的關聯關系,但是獲取字典元素時,獲取順序是不可預測的,

可以使用sorted() 來獲取按特定順序排列的鍵串列的副本:

favorite_language = {
    'herry':'java',
    'mical':'python',
    'jun':'ruby',
    'lily':'C'
    }

for name in sorted(favorite_language.keys()):
    print(name.title()+"謝謝你\n")
================= RESTART: H:\python練習\Python\Python38-32\字典.py ================
Herry謝謝你

Jun謝謝你

Lily謝謝你

Mical謝謝你

>>> 
================= RESTART: H:\python練習\Python\Python38-32\字典.py ================
Herry謝謝你

Jun謝謝你

Lily謝謝你

Mical謝謝你

輸出了兩次,都是按字典中鍵的順序輸出

遍歷字典中的所有值

如果你只想輸出字典中所有的值,不輸出鍵,你可以使用方法values(),它回傳一個值串列,而不包含任何的值,

favorite_language = {
    'herry':'java',
    'mical':'python',
    'jun':'ruby',
    'lily':'C'
    }

for language in sorted(favorite_language.values()):
    print("他們喜歡的語言有:"+language.title())
他們喜歡的語言有:C
他們喜歡的語言有:Java
他們喜歡的語言有:Python
他們喜歡的語言有:Ruby
  • 嵌套

有時候需要將一系列字典存盤在串列中,或將串列作為值存盤在字典中,這稱之為嵌套,你可以在串列中嵌套字典,在字典中嵌套串列甚至在字典中嵌套字典,

字典串列

如何管理成群結隊的外星人?一種方法是創建一個外星人串列,其中每一個外星人都是一個字典,包含有外星人的各種資訊,

alien_0 = {'color':'green','points':3}
alien_1 = {'color':'red','points':4}
alien_2 = {'color':'orange','points':6}

aliens = [alien_0,alien_1,alien_2]

for alien in aliens:
    print(alien)
{'color': 'green', 'points': 3}
{'color': 'red', 'points': 4}
{'color': 'orange', 'points': 6}

下面我們使用range() 生成30個外星人:

#創建一個外星人的空串列
aliens = []

#創建30個外星人
for alien in range(30):
    new_aliens = {'color':'green','points':3}
    aliens.append(new_aliens)

#顯示5個外星人
for alien in aliens[:5]:
    print(alien)

print("...\n")
print("一共創建了"+ str(len(aliens))+"個機器人,")
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
...

一共創建了30個機器人,

修改每個機器人的相關數值

#創建一個外星人的空串列
aliens = []

#創建30個外星人
for alien in range(30):
    new_aliens = {'color':'green','points':3}
    aliens.append(new_aliens)
    
#顯示5個外星人
for alien in aliens[0:3]:
    if alien['color'] == 'green':
        alien['color'] = 'red'
        alien['points'] = 6

for alien in aliens[0:7]:
    print(alien)

print("...\n")
print("一共創建了"+ str(len(aliens))+"個機器人,")
{'color': 'red', 'points': 6}
{'color': 'red', 'points': 6}
{'color': 'red', 'points': 6}
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
{'color': 'green', 'points': 3}
...

一共創建了30個機器人,

還可以添加一些條件

#顯示5個外星人
for alien in aliens[0:3]:
    if alien['color'] == 'green':
        alien['color'] = 'red'
        alien['points'] = 6
    elif alien['color'] == 'red':
        alien['color'] = 'green'
        alien['points'] = 3

在字典中存盤串列

存盤披薩的資訊

pizza = {
        "面皮":"榴蓮面皮",
        "佐料":["榴蓮","蝦仁","牛肉","芝士"]
    }

#錯誤,串列不能直接輸出,需要用回圈遍歷,不能再錯
'''print("你點的是1號披薩,是"+pizza["面皮"]+","+"里面有"+pizza["佐料"]+"的pizza.")'''
print("你點的是1號"+pizza["面皮"]+"披薩")

for i in pizza["佐料"]:
    print("其中1號披薩中的佐料有\t"+i)

你點的是1號榴蓮面皮披薩
其中1號披薩中的佐料有	榴蓮
其中1號披薩中的佐料有	蝦仁
其中1號披薩中的佐料有	牛肉
其中1號披薩中的佐料有	芝士

輸出每個人喜歡的語言:

favorite_language = {
    'harry':['python','php'],
    'merry':['java'],
    'micle':['c'],
    'ben':['嵌入式','c++']
    }

for k,v in favorite_language.items():
    print("\n"+k+"喜歡的是")
    for language in v:
        print("\t"+language.title())
harry喜歡的是
	Python
	Php

merry喜歡的是
	Java

micle喜歡的是
	C

ben喜歡的是
	嵌入式
	C++

在字典中存盤字典

創建一個城市字典

cities = {
    'Beijing':{
        'population':3000000,
        'country':'中國',
        'foods':['北京烤鴨','豆汁']
        },
     'GuangZhou':{
        'population':20000000,
        'country':'中國',
        'foods':['云吞','燒麥']
        },
     'NewYork':{
        'population':4000000,
        'country':'美國',
        'foods':['漢堡','牛排']
        }
    }

for k,v in cities.items():  #v就是一個小字典
    print("\n城市的名字"+k)
    new_population = v['population']
    countries = v['country']
    print("它的人口有"+str(new_population))
    print("這個城市屬于"+countries)
    for food in v['foods']:
        print("他們喜歡的食物是:"+food)
城市的名字Beijing
它的人口有3000000
這個城市屬于中國
他們喜歡的食物是:北京烤鴨
他們喜歡的食物是:豆汁

城市的名字GuangZhou
它的人口有20000000
這個城市屬于中國
他們喜歡的食物是:云吞
他們喜歡的食物是:燒麥

城市的名字NewYork
它的人口有4000000
這個城市屬于美國
他們喜歡的食物是:漢堡
他們喜歡的食物是:牛排

day_07 (用戶輸入和while回圈)

  • 使用while回圈

while回圈與for回圈的區別,for回圈用于針對集合中的每個元素的一個代碼塊,而while回圈不斷地運行,直到指定的條件不滿足為止:

使用while回圈來數數:

#while回圈
i = 0
while (i<5):
    i+=1
    print(i)
    
1
2
3
4
5

讓用戶選擇何時退出

message_0 = "你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式"

message_1 = " "

while message_1 != 'quit':
    message_1 = input(message_0)
    print(message_1)

你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式你好啊
你好啊
你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式hello
hello
你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式quit
quit

不輸出最后的quit,需要再加一個判斷陳述句;

message_0 = "你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式"
message_1 = " "

while message_1 != 'quit':
    message_1 = input(message_0)
    if message_1 !='quit':
        print(message_1)
你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式不要在意別人擁有的
不要在意別人擁有的
你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式quit
  • 使用標志

在要求很多條件滿足才能繼續運行的程式中,可定義一個變數,用于判斷整個程式是否處于活動狀態,這個變數被稱為標志,充當了程式的交通信號燈,你可以讓程式在標志為True時繼續運行,并在任何事件導致標志的值為Flase時讓程式停止運行,這樣,在while陳述句中就只需檢出一個條件——標志的當前值是否為True,并將所有的測驗都放在其他地方,從而讓程式更加簡潔,

message_0 = "你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式"
message_1 = " "
active = True
while active:
    message_1 = input(message_0)
    if message_1  =='quit':
        active = False
    else:
        print(message_1)
你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式nihao
nihao
你有兩個選擇,要么輸入一條資訊,要么輸入'quit'退出程式quit
  • 使用while回圈來處理串列和字典
#在串列之間移動元素
#首先創建兩個串列
first_list = ['apple','orange','cherry','banana']
second_list = []

#驗證每個元素,直到沒有元素為止
#將每個已驗證的元素,移到空串列當中
while first_list:
    fruits = first_list.pop()

    print("已經驗證的元素:"+fruits.title())
    second_list.append(fruits)

#顯示所有已驗證的元素
print("\n已經驗證的元素")
for i in second_list:
    print(i)
已經驗證的元素:Banana
已經驗證的元素:Cherry
已經驗證的元素:Orange
已經驗證的元素:Apple

已經驗證的元素
banana
cherry
orange
apple

洗掉包含特定值的所有串列元素

串列中有多個相同的元素,我們該如何只是將相同的元素洗掉:

#創建一個寵物串列
pets = ['dog','cat','dog','cat','fish','rabbit','cat']
print(pets)

while 'cat' in pets:
    pets.remove('cat')

print(pets)
['dog', 'cat', 'dog', 'cat', 'fish', 'rabbit', 'cat']
['dog', 'dog', 'fish', 'rabbit']

使用用戶輸入來填充字典

#使用用戶輸入來充填字典
responses = {}  #創建一個空字典

#設定一個標簽,用于指出調查是否繼續
active = True

while active:
    #提示輸入被調查者的名字和回答
    name = input("請輸入你的名字:")
    response = input("你喜歡吃什么?")

    responses[name] = response

    #看看是否還有人參與調查
    message = input("是否還有人參與調查[yes/no]")
    if message == "no":
        active = False

print("\n調查結果")
for name,response in responses.items():
    print(name.title()+"喜歡吃"+response.title()+",\n")
請輸入你的名字:ghp
你喜歡吃什么?西瓜
是否還有人參與調查[yes/no]yes
請輸入你的名字:lily
你喜歡吃什么?哈密瓜
是否還有人參與調查[yes/no]no

調查結果
Ghp喜歡吃西瓜,

Lily喜歡吃哈密瓜,

day_08(函式)

  • 定義函式
#定義一個函式
def greet_user():
    print("Hello!!!")

greet_user()
Hello!!!

向函式傳遞資訊

在greet_user()括號內添加一個引數

#定義一個函式
def greet_user(username):
    print("Hello\t"+username.title()+"\t!!!")

greet_user('GHP')
Hello	Ghp	 !!!

形參和實參

在函式greet_user()的定義中,變數username是一個形參————函式完成其作業所需要的一項資訊,在代碼greet_user('GHP') 中,值'GHP' 是一個實參,實參是呼叫函式時傳遞給函式的資訊,我們呼叫函式時,將要讓函式使用的資訊放在括號內,在greet_user('GHP')中,將實參'GHP' 傳遞給了函式greet_user(),這個值被存盤在形參username中,

  • 傳遞實參

位置實參

一個顯示寵物資訊的函式:

def pets(animal_type,animal_name):
    '''顯示寵物的資訊'''
    print("我有一條"+animal_type)
    print("\n它的名字叫做"+animal_name)

pets('短尾貓','harry')
我有一條短尾貓

它的名字叫做harry

多次呼叫函式

def pets(animal_type,animal_name):
    '''顯示寵物的資訊'''
    print("我有一條"+animal_type)
    print("它的名字叫做"+animal_name+"\n")

pets('短尾貓','harry')
pets('哈皮狗','ben')
我有一條短尾貓
它的名字叫做harry

我有一條哈皮狗
它的名字叫做ben

位置實參的順序很重要

關鍵字實參

使用關鍵字實參無需考慮函式中的順序呼叫,

def pets(animal_type,animal_name):
    '''顯示寵物的資訊'''
    print("我有一條"+animal_type)
    print("它的名字叫做"+animal_name+"\n")

pets('短尾貓','harry')
pets(animal_name='micle',animal_type='沙皮貓')
我有一條短尾貓
它的名字叫做harry

我有一條沙皮貓
它的名字叫做micle

默認值

def pets(animal_name,animal_type ='狗'):
    '''顯示寵物的資訊'''
    print("我有一條"+animal_type)
    print("它的名字叫做"+animal_name+"\n")

pets('happy')
我有一條狗
它的名字叫做happy

等效的函式呼叫

  • 回傳值

函式回傳的值稱為回傳值

回傳簡單值

def get_name(first_name,second_name):
    full_name = first_name+ '  ' + second_name
    return full_name

name_01 = get_name('周','杰倫')
print(name_01)
周  杰倫

讓實參變成可選的

def get_name(first_name,last_name,middle_name = ''):
    if middle_name:
        full_name = first_name +' ' + middle_name +' ' + last_name +"\n"
    else:
        full_name = first_name +' ' + last_name +"\n"
    return full_name

name_01 = get_name('周','杰','倫')
print(name_01)

name_02 = get_name('周','杰')
print(name_02)

Python將非空字串解讀為True,因此如果函式呼叫中提供了中間名,if middle_name將為True

周 倫 杰

周 杰

回傳字典

def build_person(first_name,last_name):
    person = {'first':first_name,'last':last_name}
    return person

message = build_person("周杰倫","張學友")
print(message)

{'first': '周杰倫', 'last': '張學友'}

存盤年齡

def build_person(first_name,last_name,age = ''):
    person = {'first':first_name,'last':last_name}
    if age:
        person['age'] = age
    return person

message = build_person("周杰倫","張學友",28)
print(message)


{'first': '周杰倫', 'last': '張學友', 'age': 28}

結合使用函式和while回圈

def get_name(first_name,second_name):
    full_name = first_name+ " " +second_name
    return full_name

while True:
    print("請輸入你的名字")
    print("輸入'q' 后可退出程式")

    f_name = input("請輸入你的姓氏")
    if f_name == 'q':
        break
    l_name = input("請輸入你的名")
    if l_name == 'q':
        break
    your_name = get_name(f_name,l_name)
    print("你好,"+your_name+"\n")

請輸入你的名字
輸入'q' 后可退出程式
請輸入你的姓氏周
請輸入你的名杰倫
你好,周 杰倫

請輸入你的名字
輸入'q' 后可退出程式
請輸入你的姓氏q
>>> 
  • 傳遞串列

假設有一個用戶串列,我想要問候其中的每位用戶,下面的示例將一個名字串列傳遞給一個名為greet_users()的函式

#向函式傳送串列
def greet_user(names):
    for name in names:
        message = "你好,"+ name+",\n"
        print(message)

user_name = ['harry','ben','jack']
greet_user(user_name)

你好,harry,

你好,ben,

你好,jack,

在函式中修改串列

一家為用戶提交的設計制作3D列印模型公司,需要列印的設計存盤在一個串列中,列印后移到另一個串列中,下面是在不使用函式的情況下模擬這個程序的代碼:

#首先創建一個串列,其中包含一些要列印的軟體
first_list = ['iphone case','robot pendant','dodecahedron']
completed_models = []

#模擬列印每個設計,直到沒有列印的設計為止
#列印每個設計后,都將其移到串列completed_models中
while first_list:
    current_design = first_list.pop()

    #模擬根據設計制作3D列印模型的程序
    print("列印模型:"+ current_design)
    completed_models.append(current_design)

#顯示列印好的所有模型
print("\n所有已經列印好的模型")
for completed_model in completed_models:
    print(completed_model )

列印模型:dodecahedron
列印模型:robot pendant
列印模型:iphone case

所有已經列印好的模型
dodecahedron
robot pendant
iphone case
  • 傳遞任意數量的實參

有時候你不知道需要接受多少個引數

例如,一個制作披薩的函式,他需要接受很多的配料,但是你無法預測顧客需要多少種配料,下面的函式只有一個形參,但是不管提供多少的實參,這個形參都將他們統統收入囊中:

def make_pizza(*toppings):  #星號*讓Python創建了一個名為toppings的新元組
    '''   列印顧客點的配料'''
    print(toppings)

make_pizza('榴蓮')
make_pizza('火腿','豬肉','牛肉','芝士','蝦仁')
('榴蓮',)
('火腿', '豬肉', '牛肉', '芝士', '蝦仁')

對客戶的要求進行遍歷

def make_pizza(*toppings):
    '''   列印顧客點的配料'''
    print("\n顧客點的披薩中的配料有")
    for i in toppings:
        print(i,end=" ")

make_pizza('榴蓮')
make_pizza('火腿','豬肉','牛肉','芝士','蝦仁')
顧客點的披薩中的配料有
榴蓮 
顧客點的披薩中的配料有
火腿 豬肉 牛肉 芝士 蝦仁 

結合使用位置實參和任意數實參

如果前面的函式還需要一個表示披薩尺寸的實參,必須將該形參放在形參*toppings的前面:

def make_pizza(size,*toppings):
    '''   列印顧客點的配料'''
    print("\n顧客點的披薩尺寸為"+str(size)+",其中的中的配料有")
    for i in toppings:
        print(i,end=" ")

make_pizza(14,'榴蓮')
make_pizza(12,'火腿','豬肉','牛肉','芝士','蝦仁')

顧客點的披薩尺寸為14,其中的中的配料有
榴蓮 
顧客點的披薩尺寸為12,其中的中的配料有
火腿 豬肉 牛肉 芝士 蝦仁 

使用任意數量的關鍵字實參

在函式中創建一個 字典,以存放輸入的鍵值對

def user_name(xing,ming,**other):
    name = {}
    print("你的姓氏是:")
    name['姓氏'] = xing
    print(name['姓氏'])
    
    print("你的名字是:")
    name['名字'] = ming
    print(name['名字'] )
    for k,v in other.items():
        name[k] = v
    return name

message = user_name('周','杰倫',hobby='打籃球',goodfor='唱歌')
print(message)

你的姓氏是:
周
你的名字是:
杰倫
{'姓氏': '周', '名字': '杰倫', 'hobby': '打籃球', 'goodfor': '唱歌'}
  • 將函式存盤在模塊中

匯入特定的函式

from 模塊名 import 函式名
from 模塊名 import 函式名1,函式名2,函式名3, ......

使用as給函式指定別名

from 模塊名 import 函式名 as 自己定的其他名字

使用as給模塊指定別名

import 模塊名 as 自己定的其他名字

匯入模塊的所有函式

使用*可以匯入模塊中的所有函式

from 模塊名 import *

day_09(類)

? 根據要求來創建物件被稱為實體化,基于類創建物件時,每個物件都自動具備這種通用行為,然后可以根據需要賦予每個物件獨特的個性,使用面向物件編程,可以模擬現實情景,其逼真程度達到令我驚訝的地步,

  • 創建和使用類

創建一個Dog類,使其每個實體都存盤名字和年齡,我們將賦予小狗蹲下和打滾的能力,

#encoding:utf-8
class Dog():
    '''一次模擬小狗的簡單嘗試'''
    def __init__(self,name,age):
        '''初始化屬性name和age'''
        self.name = name
        self.age = age
        
    def sit(self):
        '''模擬小狗被命令蹲下'''
        print(self.name.title()+"現在已經蹲下了")
        
    def roll_over(self):
        '''模擬小狗被命令時打滾'''
        print(self.name.title()+"現在正在打滾")
        
  1. 方法__init__()

    方法 init()是一個特殊的方法,當你根據Dog類創建實體時,Python都會自動運行它,在這個方法的名稱中,開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python默認方法與普通方法發生名稱沖突,

    我們將方法__init__()定義成了包含三個引數:self、name、age,在這個方法中,形參self必不可少,還須位于其他形參的前面,為何必須包含self?因為Python呼叫這個方法來創建Dog實體時,將自動傳入實參self,每個與類相關的聯的方法都自動傳遞實參self,它是一個指向實體本身的參考,讓實體能夠訪問類中的屬性和方法,

    以self為前綴的變數都可以供類中的所有方法使用,我們還可以通過類的任何實體來訪問這些變數,可以通過實體訪問的變數稱為屬性,

根據類創建實體

下面來創建一個表示特定小狗的實體(基于上面創建的Dog類):

my_dog = Dog('harry',12)

print("我的狗的名字是"+my_dog.name.title()+",")
print("\n我的狗現在已經"+str(my_dog.age)+"歲了,")
我的狗的名字是Harry,

我的狗現在已經12歲了,

呼叫方法

my_dog = Dog('harry',12)

my_dog.sit()
my_dog.roll_over()
Harry現在已經蹲下了
Harry現在正在打滾

創建多個實體

#訪問屬性
my_dog = Dog('harry',12)

print("我的狗的名字是"+my_dog.name.title()+",")
print("我的狗現在已經"+str(my_dog.age)+"歲了,")
#呼叫方法
my_dog.sit()
my_dog.roll_over()

#創建多個實體
your_dog = Dog('jack',11)

print("\n你的狗的名字是"+your_dog.name.title()+",")
print("你的狗現在已經"+str(your_dog.age)+"歲了,")

your_dog.sit()
your_dog.roll_over()
我的狗的名字是Harry,
我的狗現在已經12歲了,
Harry現在已經蹲下了
Harry現在正在打滾

你的狗的名字是Jack,
你的狗現在已經11歲了,
Jack現在已經蹲下了
Jack現在正在打滾

  • 動手試一試

餐館:創建一個名為resturant 的類,其方法__init__()設定兩個屬性:restaurant_name和cuisine_type ,創建一個名為describe_restaurant()的方法和一個名為open_restaurant()的方法,其中前者列印前述兩項資訊,而后者列印一條資訊,指出餐館正在營業,

根據這個類創建一個名為restaurant的實體,分別列印其兩個屬性,再呼叫前述兩個方法,

#encoding:utf-8
class Restaurant():
    def __init__(self,restaurant_name,cuisine_type):
        '''創建餐館的兩個屬性'''
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type

    def describe_restaurant(self):
        print("這家餐館的名字叫做"+self.restaurant_name.title())
        print("這家餐館的烹飪型別是"+self.cuisine_type)


    def open_restaurant(self):
        print("這家餐館正在營業")
        
#創建一個名為message 的實體
message_01 = Restaurant('mqilin','西餐廳')
message_02 = Restaurant('廣州酒家','粵菜')

message_01.open_restaurant()
message_01.describe_restaurant()
print("\n")
message_02.open_restaurant()
message_02.describe_restaurant()
這家餐館正在營業
這家餐館的名字叫做Mqilin
這家餐館的烹飪型別是西餐廳


這家餐館正在營業
這家餐館的名字叫做廣州酒家
這家餐館的烹飪型別是粵菜

  • 使用類和實體

car類

下面來撰寫一個表示汽車的類,它存盤了有關汽車的資訊,還有一個匯總這些資訊的方法:

#encoding:utf-8
class Car():
    '''一次模擬汽車的簡單嘗試'''

    def __init__(self,make,model,year):
        '''初始化汽車的屬性'''
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        '''回傳簡潔的資訊描述'''
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name

my_new_car = Car('BMW','a1',2020)
print(my_new_car.get_descriptive_name())

2020 BMW a1

下面給它添加一個隨時間變化的屬性,它存盤汽車的總里程,

給屬性指定默認值

下面添加一個名為odometer_reading,其初始值為0.我們還添加了一個名為read_odometer的方法,用于讀取汽車的里程表:

#encoding:utf-8
class Car():
    '''一次模擬汽車的簡單嘗試'''

    def __init__(self,make,model,year):
        '''初始化汽車的屬性'''
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        '''回傳簡潔的資訊描述'''
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name

    def read_odometer(self):
        '''列印一條指出汽車里程的資訊'''
        print("你的汽車已經行駛了"+str(self.odometer_reading)+"km!")

my_new_car = Car('BMW','a1',2020)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
2020 BMW a1
你的汽車已經行駛了0km!

修改屬性的值

#encoding:utf-8
class Car():
    '''一次模擬汽車的簡單嘗試'''

    def __init__(self,make,model,year):
        '''初始化汽車的屬性'''
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        '''回傳簡潔的資訊描述'''
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name

    def read_odometer(self):
        '''列印一條指出汽車里程的資訊'''
        print("你的汽車已經行駛了"+str(self.odometer_reading)+"km!")

my_new_car = Car('BMW','a1',2020)
print(my_new_car.get_descriptive_name())
# my_new_car.read_odometer()

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

直接修改屬性的值

?~~~
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
2020 BMW a1
你的汽車已經行駛了23km!

通過方法修改屬性的值

?~~~
my_new_car.update_odmoeter(25)
my_new_car.read_odometer()
2020 BMW a1
你的汽車已經行駛了25km!

可以對update_odometer()進行擴展,使其在修改里程表讀數時欄位外的作業,下面來添加一些邏輯,禁止任何人將里程表讀數往回呼:

?~~~
 def update_odmoeter(self,message):
        '''
        將里程表讀書設定為指定的值
        禁止里程表讀數往回呼
        '''
        if message >= self.odometer_reading:
            self.odometer_reading = message
        else:
            print("你不可以將數值回呼")
?~~~

通過方法對屬性的值進行遞增

#encoding:utf-8
class Car():
    '''一次模擬汽車的簡單嘗試'''

    def __init__(self,make,model,year):
        '''初始化汽車的屬性'''
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        '''回傳簡潔的資訊描述'''
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name

    def read_odometer(self):
        '''列印一條指出汽車里程的資訊'''
        print("你的汽車已經行駛了"+str(self.odometer_reading)+"km!")

    def update_odmoeter(self,message):
        '''
        將里程表讀書設定為指定的值
        禁止里程表讀數往回呼
        '''
        if message >= self.odometer_reading:
            self.odometer_reading = message
        else:
            print("你不可以將數值回呼")

    def increment_odometer(self,mil_message):
        '''增加里程表的讀數'''
        self.odometer_reading += mil_message

my_use_car = Car('本田','雅閣',2015)
print(my_use_car.get_descriptive_name())

my_use_car.update_odmoeter(23500)
my_use_car.read_odometer()

my_use_car.increment_odometer(100)
my_use_car.read_odometer()

2015 本田 雅閣
你的汽車已經行駛了23500km!
你的汽車已經行駛了23600km!
  • 繼承

    撰寫類時,并非總是要從空白開始,如果你撰寫的類是另一個現成類的特殊版本,可以使用繼承,一個類繼承另一個類時,他將自動獲取另一個類的所有屬性和方法;原有的類稱之為父類,而新類稱之為子類,子類繼承了父類的所有屬性和方法,同時還可以定義自己的屬性和方法,

子類的方法__init__()

下面來模擬電動車,電動車是一種特殊的汽車,因此我們可以在前面創建的Car類的基礎上創建類ElectricCar,這樣我們就只需為電動車特殊的屬性和行為撰寫代碼

#來創建一個電動車的類
class ElectricCar(Car):
    '''電動車獨特的屬性'''
    def __init__(self,make,model,year):
        '''初始化父類的屬性'''
        super().__init__(make,model,year)

my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
2016 tesla model s

創建子類時,父類必須包含在當前檔案中,且位于子類的前面

給予類定義屬性和方法

下面來添加一個電動車特有的屬性(電瓶),以及一個描述該屬性的方法,我們將存盤電瓶容量,并撰寫一個列印電瓶描述的方法:

#來創建一個電動車的類
class ElectricCar(Car):
    '''電動車獨特的屬性'''
    def __init__(self,make,model,year):
        '''
        初始化父類的屬性
        初始化電動車特有的屬性
        '''
        super().__init__(make,model,year)
        self.battery_size = 70
    def describe_battery(self):
        '''列印一條資訊來描述電瓶'''
        print("這輛電瓶車有著"+ str(self.battery_size) + "容量的電池")

my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
2016 tesla model s
這輛電瓶車有著70容量的電池

重寫父類的方法

? 對于父類的方法,只要它不符合子類模擬實物的行為,都可以對其進行重寫,為此,可以在子類中定義一個這樣的方法,即它與要重寫的父類方法同名,這樣,Python將不會考慮這個父類方法,而只關心你在子類中定義的相應方法:

假設Car類中有一個名為fill_gas_tank()的方法,它對電瓶車來說毫無意義,因此你想要重寫它,下面演示了一種重寫的方法,

class Car():
def fill_gas_tank(self):
    '''為汽車增加尾氣排放數值'''
    print("該汽車的尾氣排放量為"+ str(self.gas_tank) +"每公里")

~~~Python

class ElectricCar(Car):
def fill_gas_tank(self):
'''電動車沒有油箱'''
print("電動車不會排除尾氣")

my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
my_tesla.fill_gas_tank()
print("\n")
my_car = Car('本田','思域',2018)
my_car.fill_gas_tank()

~~~
2016 tesla model s
這輛電瓶車有著70容量的電池
電動車不會排除尾氣


該汽車的尾氣排放量為13每公里

將實體用作屬性

? 使用代碼模擬實物時,你可能會發現自己給類添加的細節越來越多:屬性和方法清單以及檔案都越來越長,在這種情況下,可能需要將類的一部分作為一個獨立的類提取出來,你可以將大型類拆分成多個協同作業的小類,

? 例如,不斷給ElectricCar類添加細節時,我們可能會發現其中包含很多專門針對汽車電瓶的屬性和方法,在這種情況下,我們可將這些屬性和方法提取出來,放到另一個專門名為Battery的類中,并將一個Battery實體用作ElectricCar類的一個屬性:

class Car():

```Python
#來創建一個電瓶類
class Battery():
    '''一次模擬電動汽車電瓶的簡單嘗試'''
    def __init__(self,battery_size=70):
        '''初始化電瓶的屬性'''
        self.battery_size = battery_size

    def describe_battery(self):
        '''列印一條描述電瓶的資訊'''
        print("這輛電動車的電瓶的容量是"+ str(self.battery_size))
        
#來創建一個電動車的類
class ElectricCar(Car):
    '''電動車獨特的屬性'''
    def __init__(self,make,model,year):
        '''
        初始化父類的屬性
        初始化電動車特有的屬性
        '''
        super().__init__(make,model,year)
        self.battery = Battery()    

my_test = ElectricCar('tesla','model s',2016)

print(my_test.get_descriptive_name())
my_test.attery.describe_battery()
```

~~~Python
2016 tesla model s
這輛電動車的電瓶的容量是70

下面再給Battery添加一個方法,它根據電瓶容量報告汽車的續航里程:

class Battery():
    '''一次模擬電動汽車電瓶的簡單嘗試'''
    def __init__(self,battery_size=70):
        '''初始化電瓶的屬性'''
        self.battery_size = battery_size

    def describe_battery(self):
        '''列印一條描述電瓶的資訊'''
        print("這輛電動車的電瓶的容量是"+ str(self.battery_size))

    def get_range(self):
        '''列印出一條資訊,指出電瓶的續航里程'''
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270

        message = "現在的電池容量能走"+str(range)+"KM 路程"
        print(message)

#來創建一個電動車的類
class ElectricCar(Car):
    '''電動車獨特的屬性'''
    def __init__(self,make,model,year):
        '''
        初始化父類的屬性
        初始化電動車特有的屬性
        '''
        super().__init__(make,model,year)
        self.battery = Battery()
        
my_test = ElectricCar('tesla','model s',2016)

print(my_test.get_descriptive_name())
my_test.battery.describe_battery()
my_test.battery.get_range()
2016 tesla model s
這輛電動車的電瓶的容量是70
現在的電池容量能走240KM 路程
  • 匯入類

隨著你不斷地給類添加功能,檔案可能變得很長,即便你妥善地使用了繼承亦如此,為遵循python的總體理念,應讓檔案盡可能整潔,為在這方面提供幫助,python允許你將類存盤在模塊中,然后在主程式中匯入所需的模塊,

匯入單個類

#encoding:utf-8
from Car import Car

my_new_car = Car('東風','日產',2022)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()
2022 東風 日產
你的汽車已經行駛了23km!

在一個模塊中存盤多個類

現在可以新建一個名為my_electric_car.py的檔案,匯入ElectricCar類,并創建一輛電動汽車了:

#encoding:utf-8
from Car import ElectricCar

my_tesla = ElectricCar('tesla','model s',2016)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
2016 tesla model s
這輛電動車的電瓶的容量是70
現在的電池容量能走240KM 路程

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145722.html

標籤:Python

上一篇:樸素貝葉斯-垃圾郵件分類

下一篇:python監聽、操作鍵盤滑鼠庫pynput詳細教程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more