python中基例_Python python从入门到实践(5) --代码复用
函數(shù)、類與代碼復(fù)用
代碼復(fù)用的思想
把代碼當(dāng)成資源進(jìn)行抽象。
代碼資源化:程序代碼是一種用來表達(dá)計(jì)算的"資源"
代碼抽象化:使用函數(shù)等方法對(duì)代碼賦予更高級(jí)別的定義
代碼復(fù)用:同一份代碼在需要時(shí)可以被重復(fù)使用
函數(shù)和對(duì)象是代碼復(fù)用的主要形式,對(duì)象化的抽象程度更高
模塊化設(shè)計(jì)、分而治之:模塊內(nèi)部緊耦合(交流多、不可獨(dú)立);模塊之間松耦合(交流少、可獨(dú)立)
函數(shù)
函數(shù)的定義
函數(shù)實(shí)例:
def do_something():
"""這是函數(shù)注釋"""
print("Hello World!")
do_something()
def進(jìn)行函數(shù)定義,接下來是函數(shù)名,括號(hào)內(nèi)是參數(shù)表,隨后是:下一行進(jìn)行函數(shù)體,三對(duì)引號(hào)是文檔注釋。像c_like語言一樣調(diào)用函數(shù)
使用參數(shù)的函數(shù):
def do_something(name):
"""這是注釋"""
print("Hello "+name.title()+"!")
do_something()
這里參數(shù)沒必要指出類型
傳遞實(shí)參:函數(shù)傳遞實(shí)參的方式很多,可使用位置實(shí)參,這要求實(shí)參順序與形參順序?qū)?yīng),也可使用關(guān)鍵字實(shí)參,其中每個(gè)實(shí)參都由變量名和值組成;此外,還可以使用列表和字典。
位置實(shí)參:調(diào)用函數(shù)時(shí),python會(huì)將每一個(gè)實(shí)參都關(guān)聯(lián)到函數(shù)定義的一個(gè)形參,最簡單的關(guān)聯(lián)方式是基于實(shí)參的順序,這種關(guān)聯(lián)方式被稱為位置實(shí)參
#定義函數(shù)
def describe_pet(animal_type, pet_name):
"""顯示寵物信息"""
print("\nI have a "+animal_type+" and its name is " + pet_name.title()+".")
#調(diào)用函數(shù), 實(shí)參按照一定順序賦值給形參
describe_pet('hamster', 'harry')
describe_pet('dog','pearl')
關(guān)鍵字實(shí)參:傳遞給函數(shù)的名稱-值對(duì),直接在是慘重將名稱和值關(guān)聯(lián),無所謂順序
#調(diào)用函數(shù),按照關(guān)鍵字傳遞實(shí)參
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(animal_type='dog',pet_name='pearl')
默認(rèn)值:在定義函數(shù)時(shí),添加默認(rèn)值,當(dāng)沒有合適的實(shí)參傳入時(shí),將會(huì)使用默認(rèn)值版本(寫法同c++),要求也與c++相同,要求帶有默認(rèn)值的形參放在最后
通過給某個(gè)形參賦值空初始值'',可以實(shí)現(xiàn)可選參數(shù)的功能
返回值:值得注意,python沒有必要定義函數(shù)時(shí)說明有無返回值和返回值類型。返回簡單值、字典都可以;返回一個(gè)值、多個(gè)值、零個(gè)值都可以。返回多個(gè)值的時(shí)候會(huì)以元組的方式返回。
~~~ python
def get_formatted_name(first_name,last_name):
full_name= first_name + ' ' + last_name
return full_name.title()
def get_formatted_name_dic(first_name,last_name):
person = {
'first': first_name,
'last': last_name
}
return person
musician = get_formatted_name('zhao','siqi')
print(musician)
~~~
傳遞列表
def greet_users(names):
"""to greet"""
for name in names:
msg = 'Hello, ' + name.title() + '!'
print(msg)
usernames['A', 'B', 'C']
grret_users(usernames)
在函數(shù)中修改列表:列表傳遞給函數(shù)后,函數(shù)就可以對(duì)其進(jìn)行修改,在函數(shù)中對(duì)列表的修改是永久性的
禁止函數(shù)修改列表:將列表的副本傳遞給函數(shù),比如function_name(list_name[:])
傳遞未定數(shù)量的實(shí)參:
有時(shí)不知道函數(shù)需要接受多少實(shí)參,于是使用可變形參*或**其中前者創(chuàng)建了一個(gè)內(nèi)容可變的空元組,后者創(chuàng)建了內(nèi)容可變的空字典
def make_pizza(*topping):
print(toppings)
make_pizza('Chicken')
make_pizza("mushroom", "Chicken", "beef")
這里的*topping創(chuàng)建了一個(gè)空元組,并將收到的所有值都封裝到元組中
同時(shí)使用位置形參和任意數(shù)量形參:位置形參應(yīng)該位于任意數(shù)量形參之前
同時(shí)使用關(guān)鍵字形參和任意數(shù)量形參:一般使用關(guān)鍵字形參和任意數(shù)量形參時(shí)都使用了空字典
def build_profile(first, last, **user_info):
profile={
'first_name': first,
'last_name': last
}
for key, value in user_info:
profile[key] = value
return profile
user_profile = build_profile('albert','einstein', location = 'German', field = 'physics')
print(user_profile)
將函數(shù)儲(chǔ)存在模塊中
將函數(shù)存儲(chǔ)在被稱為模塊的獨(dú)立文件,再將模塊導(dǎo)入(import)到主程序(注:模塊也是.py文件)
導(dǎo)入整個(gè)模塊:
import
隨后的調(diào)用函數(shù):
modele_name.function_name(...)
導(dǎo)入某個(gè)函數(shù)
from import,
使用as指定別名
from import as new_name
使用as給模塊指定別名
import as
導(dǎo)入模塊的所有函數(shù)
from module_name import*
調(diào)用函數(shù)時(shí)不必加模塊名.
局部變量和全局變量:
(這里局部變量會(huì)在離開作用域時(shí)自動(dòng)釋放)
基本數(shù)據(jù)模型,無論是否重名,局部變量與全局變量不同:
即發(fā)生了作用域和可視性的覆蓋
可以通過global關(guān)鍵字聲明全局變量
經(jīng)過實(shí)驗(yàn),global聲明的變量可以在局部作用域內(nèi)使用、修改,且會(huì)修改原始的全局變量。并且在函數(shù)內(nèi)使用global關(guān)鍵字可以創(chuàng)建原來并不存在的全局變量
def func():
global num
num = 9
return num
t = func()
m = num
print(str(t))
print(str(m))
print(str(num))
# 輸出
# 9
# 9
# 9
對(duì)于組合數(shù)據(jù)類型,如果局部變量未創(chuàng)建,那么就會(huì)使用全局變量
lambda函數(shù):
lambda函數(shù)是一種匿名函數(shù),使用Lambda保留字定義,不指定函數(shù)名,函數(shù)名即為賦值的變量(類似于創(chuàng)建了一個(gè)函數(shù)指針,將指針賦給了某變量,隨后該變量可當(dāng)作函數(shù)名正常使用),一般僅僅定義簡單的,能夠用一行表示的代碼,常常用于大型函數(shù)的函數(shù)對(duì)象使用
# 基本形式
= Lambda :
# 例子
add = Lambda x, y : x+y
函數(shù)編寫時(shí)的注意細(xì)節(jié):
命名只使用小寫字母和下劃線
包含帶有對(duì)功能簡易說明的注釋
給形參指定默認(rèn)值時(shí)等號(hào)兩側(cè)不要加空格
所有import都要放在(除了)注釋外的最前面
定義函數(shù)的代碼塊后加兩行空行與其他部分分開
函數(shù)遞歸
關(guān)鍵特征:
鏈條:計(jì)算過程中存在遞歸鏈條
基例:存在一個(gè)或多個(gè)不需要再次遞歸的基例
核心編寫方法在于分支語句對(duì)參數(shù)進(jìn)行判斷,分別處理基例和鏈條
類和對(duì)象
根據(jù)約定,在python中,首字母大寫的名稱指的是類(即是命名規(guī)則,也是使用提示)
創(chuàng)建和使用類:
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + "is sitting")
類中的函數(shù)稱為方法,與普通函數(shù)的唯一區(qū)別在于調(diào)用的方式,通過對(duì)象.方法名(參數(shù)表)的方式調(diào)用
__init__()是一種特殊的函數(shù)(構(gòu)造函數(shù)),創(chuàng)建實(shí)例時(shí)自動(dòng)調(diào)用
形參self必不可少,且必須位于其他形參最前面,但是調(diào)用時(shí)不必傳遞實(shí)參,因?yàn)樗詣?dòng)指向?qū)嵗旧淼囊?/p>
使用類
# 已經(jīng)定義好Dog類
#創(chuàng)建實(shí)例
my_dog = Dog("A", 3)
#訪問屬性
print("My dog's name is "+my_dog.name.title())
#調(diào)用方法
my_dog.sit()
給屬性指定默認(rèn)值:在構(gòu)造函數(shù)(__init__)指定這種初始值,此時(shí)不必在形參表中寫出
修改屬性的值:
通過訪問成員直接修改屬性的值
定義成員函數(shù)修改屬性的值
繼承
子類的構(gòu)造函數(shù)
class Dog():
#略
class My_dog(Dog):
def __init__(self, name, age, weight):
super().__init__(name, age)
self.weight = weight
通過super()獲取父類的引用,隨后借助父類的構(gòu)造函數(shù)完成構(gòu)造
重寫父類的方法:在子類中定義一個(gè)與父類中同名的方法,此時(shí)會(huì)直接調(diào)用子類的同名方法
將實(shí)例用作屬性:使用代碼模擬實(shí)物時(shí),類中的屬性和方法可能會(huì)越來越長,此時(shí)將類的一部分作為一個(gè)獨(dú)立的類提取出來,將大型類拆分成多個(gè)協(xié)同工作的小類
導(dǎo)入類:與導(dǎo)入函數(shù)的操作基本相同
Python標(biāo)準(zhǔn)庫:
Python標(biāo)準(zhǔn)庫是一組模塊,安裝的python都含有它
例題:使用collections的一個(gè)類——OrderedDict,這是一個(gè)有序字典,在保存鍵值對(duì)關(guān)系的同時(shí)保留順序
from collections import OrderedDict
favorite_languages = OrderedDict()
favorite_languages['Jen'] = 'python'
favorite_languages['Sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
for name.language in favotite_languages.items():
print(name.title() + "like " + language + ".")
類編碼風(fēng)格
類名實(shí)施駝峰命名法,將每個(gè)單詞的首字母大寫,不適用下劃線,實(shí)例名和模塊名使用小寫,并在單詞之間加下劃線。
每個(gè)類在定義后使用文檔注釋描述類功能
在需要同時(shí)導(dǎo)入標(biāo)準(zhǔn)庫和編寫的自定義模板時(shí),先import標(biāo)準(zhǔn)庫,空行,再import自定義庫
總結(jié)
以上是生活随笔為你收集整理的python中基例_Python python从入门到实践(5) --代码复用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql unique 锁_mysql
- 下一篇: python 装饰器有哪些_Python