日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

编写python程序、创建名为class的数据库_python面向对象编程class1

發布時間:2023/12/19 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写python程序、创建名为class的数据库_python面向对象编程class1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python面向對象編程class1

#!/usr/bin/python

class clz:

###name="nam330"

def __init__(self):

self.id=111

self.name="nam222"

print("Hello,1 World!",id,self.id)

def setName(self,name):

self.name=name

print("Hello,2 World!",name,self.name)

@property

def getName(self):

print("Hello,5 World!",self.name)

return self.name

def getNam(self):

print("Hello,5 World!",self.name)

return self.name

c=clz()

print("Hello,3 World!")

###c.setName("name333")

print("Hello,4 World!",c.name)

print("Hello,6 World!",c.getNam() )

print("Hello,6 World!",c.getName )

print("Hello,3 World!")

c.setName("name333")

print("Hello,7 World!",c.name)

print("Hello,8 World!",c.getNam() )

print("Hello,9 World!",c.getName )

python面向對象編程

本篇內容:

1、反射

2、面向對象編程

3、面向對象三大特性

4、類成員

5、類成員修飾符

6、類的特殊成員

7、單例模式

反射

python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用于對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。

復制代碼

import commas同等于下面字符串導入模塊

inp = input("請輸入模塊名:")

dd = __import__(inp)

ret =dd.f1()

print(ret)

復制代碼

復制代碼

#應用根據用戶輸入導入模塊

inp = input("請輸入模塊:")

inp_func = input("請輸入執行的函數:")

# __import__以字符串的形式導入模塊

moudle = __import__(inp)

#getattr 用以去某個模塊中尋找某個函數

target_func = getattr(moudle,inp_func)

relust = target_func()

print(relust)

復制代碼

1、getattr

通過字符串的形式去某個模塊中尋找東西

import commas

#去commas,尋找name變量,找不到返回none

target_func = getattr(commas ,"name",None)

print(target_func)

2、hasattr

通過字符串的形式去某個模塊中判斷東西是否存在

import commas

#去commas模塊中尋找f1,有返回true,沒有返回none

target_func = hasattr(commas,"f1")

print(target_func)

3、setattr

通過字符串的形式去某個模塊中設置東西

復制代碼

import commas

#去commas模塊中尋找name,有返回true,沒有返回none

target_func1 = hasattr(commas,"name")

print(target_func1)

#在內存里往commas模塊中添加name = "zhangyanlin"

setattr(commas,"name","zhangyanlin")

#在內存里往commas模塊中創建函數

setattr(commas,"f3",lambda x: "zhen" if x >10 else "jia")

#去commas模塊中尋找name,有返回true,沒有返回none

target_func = hasattr(commas,"name")

print(target_func)

復制代碼

4、delattr

復制代碼

import commas

target_func = hasattr(commas,"f1")

print(target_func)

del_func = delattr(commas,"f1")

target_func = hasattr(commas,"f1")

print(target_func)

復制代碼

案例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

'''

基于web框架實現路由功能

'''

url = str(input("請輸入URL:")) #輸入URL,先輸入模塊,后面加函數

target_moudle,target_func = url.split("/") # 用/把分割開,前面是模塊 后面是函數

moudle = __import__(target_moudle,fromlist=True) #導入模塊

if hasattr(moudle,target_func): #判斷模塊里有這個函數

target_func = getattr(moudle,target_func) #找到那個函數

ret = target_func() #執行函數

print(ret)

else: #否則報錯

print("404")

復制代碼

class Foo:

def __init__(self,name):

self.name = name

def login(self):

print("登錄請按1:")

obj = Foo("zhangyanlin")

ret = getattr(obj,"name")

print(ret)

#反射

#以字符串的形式去對續航中操作成員

#反射:類,只能找類的成員

ret = hasattr(Foo,"login")

print(ret)

#反射:對象,既可以找對象也能找類的成員

ret = hasattr(obj,"name")

print(ret)

ret = hasattr(obj,"login")

print(ret)

復制代碼

面向對象編程

面向過程:根據業務邏輯從上到下寫壘代碼

函數式:將某功能代碼封裝到函數中,日后便無需重復編寫,僅調用函數即可

面向對象:對函數進行分類和封裝,讓開發“更快更好更強...”

面向過程編程最易被初學者接受,其往往用一長段代碼來實現指定功能,開發過程中最常見的操作就是粘貼復制,即:將之前實現的代碼塊復制到現需功能處。

1、創建類和對象

面向對象編程是一種編程方式,此編程方式的落地需要使用 “類” 和 “對象” 來實現,所以,面向對象編程其實就是對 “類” 和 “對象” 的使用。

類就是一個模板,模板里可以包含多個函數,函數里實現一些功能

對象則是根據模板創建的實例,通過實例對象可以執行類中的函數

class是關鍵字,表示類

創建對象,類名稱后加括號即可

1

2

3

4

5

6

7

8

9

10

11

12

13

# 創建類

class Foo:

def Bar(self):

print 'Bar'

def Hello(self, name):

print 'i am %s' %name

# 根據類Foo創建對象obj

obj = Foo()

obj.Bar() #執行Bar方法

obj.Hello('wupeiqi') #執行Hello方法

一、封裝

封裝,顧名思義就是將內容封裝到某個地方,以后再去調用被封裝在某處的內容。所以,在使用面向對象的封裝特性時,需要:

將內容封裝到某處

從某處調用被封裝的內容

第一步:將內容封裝到某處

demo

第二步:從某處調用被封裝的內容調用被封裝的內容時,有兩種情況:

通過對象直接調用

通過self間接調用

1、通過對象直接調用被封裝的內容上圖展示了對象 obj1 和 obj2 在內存中保存的方式,根據保存格式可以如此調用被封裝的內容:對象.屬性名

demo 2、通過self間接調用被封裝的內容執行類中的方法時,需要通過self間接調用被封裝的內容

demo 二、繼承繼承,面向對象中的繼承和現實生活中的繼承相同,即:子可以繼承父的內容。例如:  貓可以:喵喵叫、吃、喝、拉、撒  狗可以:汪汪叫、吃、喝、拉、撒吃、喝、拉、撒是貓和狗都具有的功能,而我們卻分別的貓和狗的類中編寫了兩次。如果使用 繼承 的思想,如下實現:  動物:吃、喝、拉、撒   貓:喵喵叫(貓繼承動物的功能)   狗:汪汪叫(狗繼承動物的功能)

demo所以,對于面向對象的繼承來說,其實就是將多個類共有的方法提取到父類中,子類僅需繼承父類而不必一一實現每個方法。注:除了子類和父類的稱謂,你可能看到過 派生類 和 基類 ,他們與子類和父類只是叫法不同而已。 那么問題又來了,多繼承呢?

是否可以繼承多個類

如果繼承的多個類每個類中都定了相同的函數,那么那一個會被使用呢?

1、Python的類可以繼承多個類,Java和C#中則只能繼承一個類

demo 三、多態 Pyhon不支持多態并且也用不到多態,多態的概念是應用于Java和C#這一類強類型語言中,而Python崇尚“鴨子類型”。

python偽代碼實現java,c#多態

python“鴨子類型” 類成員 1、字段:

靜態字段:提供給類里每個對象(方法)使用

普通字段:讓每個方法都有不同的數據

2、方法:

靜態方法: 無需使用對象封裝,用類方法執行

類方法: 類方法執行,調用時會顯示出當前是哪個類

普通方法: 對象方式執行,使用對象中的數據

3、特性:

可以獲取特性 也可以設置特性

一、字段字段包括:普通字段和靜態字段,他們在定義和使用中有所區別,而最本質的區別是內存中保存的位置不同,

普通字段屬于對象

靜態字段屬于類

View Code由上述代碼可以看出【普通字段需要通過對象來訪問】【靜態字段通過類訪問】,在使用上可以看出普通字段和靜態字段的歸屬是不同的。其在內容的存儲方式類似如下圖:注:靜態字段只在內存中保存一份,普通字段在每個對象中都要保存一份 二、方法方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬于類,區別在于調用方式不同。  1、普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self;  2、類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類復制給cls;  3、靜態方法:由類調用;無默認參數;

定義方法并使用相同點:對于所有的方法而言,均屬于類(非對象)中,所以,在內存中也只保存一份。不同點:方法調用者不同、調用方法時自動傳入的參數不同。 三、特性  如果你已經了解Python類中的方法,那么特性就非常簡單了,因為Python中的屬性其實是普通方法的變種。對于特性,有以下兩個知識點:  1、特性的基本使用  2、特性的兩種定義方式 1、特性的基本使用

特性由屬性的定義和調用要注意一下幾點:  1、定義時,在普通方法的基礎上添加 @property 裝飾器;  2、定義時,屬性僅有一個self參數  3、調用時,無需括號

方法:foo_obj.func()

屬性:foo_obj.prop注意:屬性存在意義是:訪問屬性時可以制造出和訪問字段完全相同的假象 屬性由方法變種而來,如果Python中沒有屬性,方法完全可以代替其功能。實例:對于主機列表頁面,每次請求不可能把數據庫中的所有內容都顯示到頁面上,而是通過分頁的功能局部顯示,所以在向數據庫中請求數據時就要顯示的指定獲取從第m條到第n條的所有數據(即:limit m,n),這個分頁的功能包括:  1、根據用戶請求的當前頁和總數據條數計算出 m 和 n  2、根據m 和 n 去數據庫中請求數據

View Code 2、屬性的兩種定義方式屬性的定義有兩種方式:  1、裝飾器 即:在方法上應用裝飾器  2、靜態字段 即:在類中定義值為property對象的靜態字段 1.1 裝飾器方式經典類,具有一種@property裝飾器

View Code新式類,具有三種@property裝飾器

View Code注:1、經典類中的屬性只有一種訪問方式,其對應被 @property 修飾的方法

2、新式類中的屬性有三種訪問方式,并分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法由于新式類中具有三種訪問方式,我們可以根據他們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除

View Code 1.2 靜態字段方式,創建值為property對象的靜態字段當使用靜態字段的方式創建屬性時,經典類和新式類無區別

View Codeproperty的構造方法中有個四個參數  1、第一個參數是方法名,調用 對象.屬性 時自動觸發執行方法  2、第二個參數是方法名,調用 對象.屬性 = XXX 時自動觸發執行方法  3、第三個參數是方法名,調用 del 對象.屬性 時自動觸發執行方法  4、第四個參數是字符串,調用 對象.屬性.__doc__ ,此參數是該屬性的描述信息

View Code由于靜態字段方式創建屬性具有三種訪問方式,我們可以根據他們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除

View Code所以,定義屬性共有兩種方式,分別是【裝飾器】和【靜態字段】,而【裝飾器】方式針對經典類和新式類又有所不同。 類成員修飾符 類的所有成員在上一步驟中已經做了詳細的介紹,對于每一個類的成員而言都有兩種形式:  1、公有成員,在任何地方都能訪問  2、私有成員,只有在類的內部才能方法 私有成員和公有成員的定義不同:私有成員命名時,前兩個字符是下劃線。(特殊成員除外,例如:__init__、__call__、__dict__等)

1

2

3

4

5

class C:

def __init__(self):

self.name = '公有字段'

self.__foo = "私有字段"

私有成員和公有成員的訪問限制不同: 1、靜態字段  1、公有靜態字段:類可以訪問;類內部可以訪問;派生類中可以訪問  2、私有靜態字段:僅類內部可以訪問;

公有字段

私有字段2、普通字段  1、公有普通字段:對象可以訪問;類內部可以訪問;派生類中可以訪問  2、私有普通字段:僅類內部可以訪問;注:如果想要強制訪問私有字段,可以通過 【對象._類名__私有字段明 】訪問(如:obj._C__foo),不建議強制訪問私有成員。

公有字段

私有字段 類的特殊成員 1、 __doc__  表示類的描述信息

View Code2、 __module__ 和 __class__   __module__ 表示當前操作的對象在那個模塊  __class__ 表示當前操作的對象的類是什么

lib/test.py

index3、 __init__  構造方法,通過類創建對象時,自動觸發執行。

View Code

繼承父類__init__ 4、 __del__  析構方法,當對象在內存中被釋放時,自動觸發執行。注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的。

code 5、 __call__  對象后面加括號,觸發執行。注:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對于 __call__ 方法的執行是由對象后加括號觸發的,即:對象() 或者 類()()

View Code6、 __dict__  類或對象中的所有成員上文中我們知道:類的普通字段屬于對象;類中的靜態字段和方法等屬于類,即:

View Code7、 __str__如果一個類中定義了__str__方法,那么在打印 對象 時,默認輸出該方法的返回值。

View Code8、__getitem__、__setitem__、__delitem__用于索引操作,如字典。以上分別表示獲取、設置、刪除數據

View Code9、 __iter__ 用于迭代器,之所以列表、字典、元組可以進行for循環,是因為類型內部定義了 __iter__

View Code

for循環內部語法 單例模式 所謂單例,是指一個類的實例從始至終只能被創建一次。 方法1如果想使得某個類從始至終最多只有一個實例,使用__new__方法會很簡單。Python中類是通過__new__來創建實例的:

1

2

3

4

5

6

7

8

9

10

11

12

13

class Singleton(object):

def __new__(cls,*args,**kwargs):

if not hasattr(cls,'_inst'):

cls._inst=super(Singleton,cls).__new__(cls,*args,**kwargs)

return cls._inst

if __name__=='__main__':

class A(Singleton):

def __init__(self,s):

self.s=s

a=A('apple')

b=A('banana')

print(id(a),a.s)

print(id(b),b.s)

結果:

1

2

29922256 banana

29922256 banana

通過__new__方法,將類的實例在創建的時候綁定到類屬性_inst上。如果cls._inst為None,說明類還未實例化,實例化并將實例綁定到cls._inst,以后每次實例化的時候都返回第一次實例化創建的實例。注意從Singleton派生子類的時候,不要重載__new__。 方法2當你編寫一個類的時候,某種機制會使用類名字,基類元組,類字典來創建一個類對象。新型類中這種機制默認為type,而且這種機制是可編程的,稱為元類__metaclass__ 。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Singleton(type):

def __init__(self,name,bases,class_dict):

super(Singleton,self).__init__(name,bases,class_dict)

self._instance=None

def __call__(self,*args,**kwargs):

if self._instance is None:

self._instance=super(Singleton,self).__call__(*args,**kwargs)

return self._instance

if __name__=='__main__':

class A(object):

__metaclass__=Singleton

a=A()

b=A()

print(id(a),id(b))

結果:

1

34248016 34248016

id是相同的。例子中我們構造了一個Singleton元類,并使用__call__方法使其能夠模擬函數的行為。構造類A時,將其元類設為Singleton,那么創建類對象A時,行為發生如下:A=Singleton(name,bases,class_dict),A其實為Singleton類的一個實例。創建A的實例時,A()=Singleton(name,bases,class_dict)()=Singleton(name,bases,class_dict).__call__(),這樣就將A的所有實例都指向了A的屬性_instance上,這種方法與方法1其實是相同的。 方法4最簡單的方法:

1

2

3

class singleton(object):

pass

singleton=singleton()

將名字singleton綁定到實例上,singleton就是它自己類的唯一對象了。 方法5

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

class ConnectionPool:

__instance = None

def __init__(self):

self.ip = "192.168.1.1"

self.port = 3306

self.username = "zhangyanlin"

self.pwd = 123456

@staticmethod

def get_instance():

if ConnectionPool.__instance:

return ConnectionPool.__instance

else:

ConnectionPool.__instance = ConnectionPool()

return ConnectionPool.__instance

obj1 = ConnectionPool()

print(obj1.get_instance())

obj2 = ConnectionPool()

print(obj2.get_instance())

obj3 = ConnectionPool()

print(obj3.get_instance())

定義靜態方法,判斷讓所有只用第一個對象在內存中創建的ID

一、功能分析

日常生活中我們用的計算器都包括加減乘除冪平方立方1 - 2 * ( (60-30 +(-9**5-2-5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )這么這么長的一個式子,大家算的時候都知道先算冪,立方,平方,再算乘除,加減

二、知識點

所用到的python的知識點有:

正則表達式re模塊

字符串的處理

三、程序實現流程分析

用正則表達式處理字符串,只提取其中的數字和運算符,并轉換成列表

編寫一個函數,處理沒有括號的基本運算的基本表達式

再寫一個函數遞歸處理帶有括號的函數,先計算最內部括號中的表達式, 然后將最內部的括號替換為計算后的結果, 在遞歸外部一層的, 最后返回的就是所需的結果

四、代碼部分

上面也說了處理的時候先處理冪,平方,立方

1、處理冪函數

import re,sys

def Power(arg):

'''

計算冪函數

:param arg: 傳進來的等式

:return: 返回計算完的等式

'''

while True:

relust = re.split(r"(\d+\.?\d*[\*/]{2}-?\d+\.?\d*)", arg, 1)

if len(relust) == 3: # 判斷切割出來的是不是3個元素

before = relust[0] # 第一個元素賦值給before

content = relust[1] # 第二個元素賦值給content

after = relust[2]

if "**" in content: #如果等式里面有“**”

start,end = content.split("**") #用**吧分割開

finlly = float(start) ** float(end) #計算冪等式

arg = before + str(finlly) + after #把結果替換回原等式

else:

return arg

2、處理乘除

從左往右的時候不能先算乘,必須遇到乘就算乘遇到除就算除,樓主在這踩過坑,所以大家也注意下:

def Multply_didvid(arg): #定義乘除運算的函數

'''

計算加減

:param arg: 傳進來的算法

:return: 返回運算結果

'''

while True: #while循環每一次傳進來的運算

arg = re.sub(r"\+\+","+",arg)

arg = re.sub(r"\+\-", "-", arg)

arg = re.sub(r"\-\+", "-", arg)

arg = re.sub(r"\-\-", "+", arg)

relust = re.split(r"(\d+\.?\d*[\*/]-?\d+\.?\d*)",arg,1) #把從左往右第一次匹配到得乘法

# print(relust)

if len(relust) ==3: #判斷切割出來的是不是3個元素

before = relust[0] #第一個元素賦值給before

content = relust[1] #第二個元素賦值給content

after = relust[2] #第三個元素賦值給after

if "*" in content: #判斷第二個元素里面有沒有"*"

start,end = content.split("*") #用“*”把分割開賦值給start,end

finlly = float(start) * float(end) #運算出乘法

arg = before+str(finlly)+after #替換原來的運算式

else: #否則就是除法

start, end = content.split("/") #用/分割開賦值給start,end

finlly = float(start) / float(end) #把除法算出來

arg = before + str(finlly) + after #替換原來的元算是

# print(arg)

else:

return arg #將運算結果返回去

3、處理加減

加減是最簡單的,把每個數字帶前面的符號給切割出來,然后給定義一個計數器,依次相加就可得出結果

def Add_sub(arg): #加減法運算-9-2-5-2+5-3

'''

計算加減運算

:param arg: 傳進來的算術

:return: 返回運算結果

'''

result = re.findall(r"[\+\-]?\d+\.?\d*",arg) #列出所有的元素

start = 0 #定義空值讓他挨個去加

for i in result:

start += float(i) #讓素有元素相加

return start #返回運算結果

4、式子處理函數

拿到式子,我們肯定是先處理式子,把有括號得拿出來處理

def Calculate(source):

'''

計算函數

:param source: 傳進來的等式

:return: 返回計算結果

'''

while True:

source = re.sub(r"\s*", "", source) #去掉空格

source = source.replace("++","+").replace("+-","-").replace("--","+").replace("-+","-") #替換符號

res = re.split(r"\(([^()]+)\)",source,1) #先取出括號里面的值

if len(res) ==3: #判斷分割出來的是不是3個元素

before = res[0] #分別將元素賦值給三個值

content = res[1]

after = res[2]

powe = Power(content)

mu_di = Multply_didvid(powe) #執行乘除

ad_su = Add_sub(mu_di) #執行加減

res = before + str(ad_su) + after #運算結果替換原來等式

source = res #賦值給其他傳進來元素

#print("去括號得到得值為:",source)

else:

powe = Power(source)

mu_di = Multply_didvid(powe) #沒括號得等式

ad_su = Add_sub(mu_di) #計算加法

source = ad_su

# print('最后結果為:',ad_su) #打印最后結果

return source

到這里為止,代碼就可以算是完成了,下面把代碼總和起來,可以運行試試看:

import re,sys

def Power(arg):

'''

計算冪函數

:param arg: 傳進來的等式

:return: 返回計算完的等式

'''

while True:

relust = re.split(r"(\d+\.?\d*[\*/]{2}-?\d+\.?\d*)", arg, 1)

if len(relust) == 3: # 判斷切割出來的是不是3個元素

before = relust[0] # 第一個元素賦值給before

content = relust[1] # 第二個元素賦值給content

after = relust[2]

if "**" in content: #如果等式里面有“**”

start,end = content.split("**") #用**吧分割開

finlly = float(start) ** float(end) #計算冪等式

arg = before + str(finlly) + after #把結果替換回原等式

else:

return arg

def Multply_didvid(arg): #定義乘除運算的函數

'''

計算加減

:param arg: 傳進來的算法

:return: 返回運算結果

'''

while True: #while循環每一次傳進來的運算

arg = re.sub(r"\+\+","+",arg)

arg = re.sub(r"\+\-", "-", arg)

arg = re.sub(r"\-\+", "-", arg)

arg = re.sub(r"\-\-", "+", arg)

relust = re.split(r"(\d+\.?\d*[\*/]-?\d+\.?\d*)",arg,1) #把從左往右第一次匹配到得乘法

# print(relust)

if len(relust) ==3: #判斷切割出來的是不是3個元素

before = relust[0] #第一個元素賦值給before

content = relust[1] #第二個元素賦值給content

after = relust[2] #第三個元素賦值給after

if "*" in content: #判斷第二個元素里面有沒有"*"

start,end = content.split("*") #用“*”把分割開賦值給start,end

finlly = float(start) * float(end) #運算出乘法

arg = before+str(finlly)+after #替換原來的運算式

else: #否則就是除法

start, end = content.split("/") #用/分割開賦值給start,end

finlly = float(start) / float(end) #把除法算出來

arg = before + str(finlly) + after #替換原來的元算是

# print(arg)

else:

return arg #將運算結果返回去

def Add_sub(arg): #加減法運算-9-2-5-2+5-3

'''

計算加減運算

:param arg: 傳進來的算術

:return: 返回運算結果

'''

result = re.findall(r"[\+\-]?\d+\.?\d*",arg) #列出所有的元素

start = 0 #定義空值讓他挨個去加

for i in result:

start += float(i) #讓素有元素相加

return start #返回運算結果

def Calculate(source):

'''

計算函數

:param source: 傳進來的等式

:return: 返回計算結果

'''

while True:

source = re.sub(r"\s*", "", source) #去掉空格

source = source.replace("++","+").replace("+-","-").replace("--","+").replace("-+","-") #替換符號

res = re.split(r"\(([^()]+)\)",source,1) #先取出括號里面的值

if len(res) ==3: #判斷分割出來的是不是3個元素

before = res[0] #分別將元素賦值給三個值

content = res[1]

after = res[2]

powe = Power(content)

mu_di = Multply_didvid(powe) #執行乘除

ad_su = Add_sub(mu_di) #執行加減

res = before + str(ad_su) + after #運算結果替換原來等式

source = res #賦值給其他傳進來元素

#print("去括號得到得值為:",source)

else:

powe = Power(source)

mu_di = Multply_didvid(powe) #沒括號得等式

ad_su = Add_sub(mu_di) #計算加法

source = ad_su

# print('最后結果為:',ad_su) #打印最后結果

return source

print('\n****************************************************************')

print(' \033[33m 歡迎使用計算器(^-_-^) \033[0m')

print('\n****************************************************************')

print("計算等式直接復制即可!:","1 - 2 * ( (60-30 +(-9**5-2-5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")

while True:

inp = input("請輸入計算等式(q\退出):")

if inp =="q":

sys.exit("歡迎下次光臨!")

elif not inp.strip():

inp = inp.strip()

continue

else:

fin = Calculate(inp)

print("計算結果為:%s" % fin)

print("eval結果為:%s" % eval(inp))

五:總結

死是不是發現還有點復雜,我相信大家還能寫出更簡單的,當然python為了追求簡單,一行代碼也可以搞定,eval()函數直接搞定,但是自己寫下好提高自己的能力嘛

總結

以上是生活随笔為你收集整理的编写python程序、创建名为class的数据库_python面向对象编程class1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。