1. 程式人生 > 實用技巧 >20200727----python學習總結

20200727----python學習總結

#/urn/bin/env python
#-*- coding:utf-8 -*-

class Function_demo(object):
name = 'demo'
def run(self):
return "hello function "

if hasattr(Function_demo,'addr'):
addr = getattr(Function_demo,'addr')
print(addr)
else:
addr = getattr(Function_demo,'addr',setattr(Function_demo,'addr','首都北京'))
print(addr)

#方法二 :判斷一個物件的屬性是否存在,若不存在,則新增該屬性

class Function_demo(object):
name = 'demo'
def run(self):
return "hello function "

if not hasattr(Function_demo,'age'):
setattr(Function_demo,'age',18)
print(getattr(Function_demo,'age'))

#學習__dict__函式
class A(object):
a = 0
b = 1
def __init__(self):
self.a = 2
self.b = 3
def test(self):
print('a normal func')
@staticmethod
def static_test(self):
print('a static func')
@classmethod
def class_test(self):
print('a calss func')
obj = A()
print(A.__dict__)
print(obj.__dict__)
#{'__module__': '__main__', 'a': 0, 'b': 1, '__init__': <function A.__init__ at 0x0000015E6718E8B0>,
# 'test': <function A.test at 0x0000015E6718E940>,
# 'static_test': <staticmethod object at 0x0000015E670D8430>,
# 'class_test': <classmethod object at 0x0000015E670E83A0>,
# '__dict__': <attribute '__dict__' of 'A' objects>,
# '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
#{'a': 2, 'b': 3}

class Parent(object):
a = 0
b = 1
def __init__(self):
self.a = 2
self.b = 3
def p_test(self):
pass

class Child(Parent):
a = 4
b = 5
def __init__(self):
super(Child, self).__init__()
self.a = 6
self.b = 7

def c_test(self):
pass

p = Parent()
c = Child()
print(Parent.__dict__)
print(Child.__dict__)
print(p.__dict__)
print(c.__dict__)

# {'__module__': '__main__', 'a': 0, 'b': 1, '__init__': <function Parent.__init__ at 0x0000023B1CFBE8B0>, 'p_test': <function Parent.p_test at 0x0000023B1CFBE940>, '__dict__': <attribute '__dict__' of 'Parent' objects>, '__weakref__': <attribute '__weakref__' of 'Parent' objects>, '__doc__': None}
# {'__module__': '__main__', 'a': 4, 'b': 5, '__init__': <function Child.__init__ at 0x0000023B1CFBE9D0>, 'c_test': <function Child.c_test at 0x0000023B1CFBEA60>, 'p_test': <function Child.p_test at 0x0000023B1CFBEAF0>, '__doc__': None}
# {'a': 2, 'b': 3}
# {'a': 6, 'b': 7}



#__str__()函式學習
class ss1(object):
def __init__(self,age,name):
self.age = age
self.name = name
def __str__(self):
return str(self.age)+",,wozenmezhemeshuai,,"+self.name
if __name__=="__main__":
s1= ss1(21,'aitebao')
print(s1)
#輸出結果為:21,,wozenmezhemeshuai,,aitebao

class ss2:
def __init__(self,age,name):
self.age = age
self.name = name
if __name__=="__main__":
s2 = ss2(21,'aitebao')
print(s2)
#輸出結果為:<__main__.ss2 object at 0x000001838A330D60>


__new__()函式與__init__()函式學習
class A(object):
def __new__(cls):
return object.__new__(cls)

def __init__(self):
self.val = 0
#可以看到,在__new__的階段就已經建立了物件,然後__init__只是執行初始化操作而已。

class A(object):
def __new__(cls):
return 0

def __init__(self):
self.val = 0
a = A()
print(a)
#輸出結果為:0
#因為此時建立的物件是一個int,因此不會再執行A的__init__函式


class A(object):
def __call__(self,x):
print('__call__ called ,print x:',x)

a = A()
a('123')
#輸出結果為:__call__ called ,print x: 123

import requests

class A(object):
def __init__(self):
pass

def __call__(self,url,method = 'post',data= None):
if method == 'get':
res = requests.get(url,data)
else:
res = requests.post(url,data)
return res

if __name__== '__main__':
url = 'https://translate.google.com/'
a = A()
print(a(url,'post'))


class Point:
def __init__(self):
pass

def __str__(self):
return 'Point is (%s,%s)' %(self.x, self.y)

def __setitem__(self, key, value):
print('Called the __setitem__ function')
self.__dict__[key] = value

def __getitem__(self, item):
print('Called the __getitem__ function')
try:
if item == 'x':
return '%s' %self.x
elif item == 'y':
return '%s' %self.y
except:
return 'There is no this item in class Point'

def __delitem__(self, key):
del self.__dict__[key]

if __name__ == '__main__':
p = Point()
p['x'] = 3
print(p['x'])
p['y'] = 6
print(p)
del p['x']
print(p['x'])

#輸出結果為:
# Called the __setitem__ function
# Called the __getitem__ function
# 3
# Called the __setitem__ function
# Point is (3,6)
# Called the __getitem__ function
# There is no this item in class Point

class Foo(object):
def __init__(self):
self.name = 'xiaoli'
self.age = 12

def __getitem__(self,item):
print('getitem'.item)
return self.__dict__[item]

def __setitem__(self,key,value):
print('setitem')
self.__dict[key] = value

def __delitem__(self,key):
print('delitem')
self.__dict__[key]

f1 = Foo()
print(f1.__dict__)
print(f1.age,f1.name)

d = {'one': 1, 'two': 2, 'three': 3}
print(d.items())
#輸出結果為:dict_items([('one', 1), ('two', 2), ('three', 3)])
print(type(d.items()))
#輸出結果為:<class 'dict_items'>
for i in d.items():
print(i)
#輸出結果為:
# ('one', 1)
# ('two', 2)
# ('three', 3)


import random
print(random.random())
輸出結果為:0到1之間的浮點數


import random
print(random.uniform(1,9)) #輸出結果為:隨機生成1-9之間的浮點數
print(random.uniform(10,0)) #輸出結果為:隨機生成0-10之間的浮點數

import random
# # print(random.randint(2,7)) #輸出結果為:隨機生成一個2-7之間的整數

import random
print(random.randrange(10,30,2))
print(random.choice(range(10,30,2)))


import random
# # # lst= ['python','C','C++','javascript','perl']
# # # str1 = ('I love python')
# # # print(random.choice(lst))
# # # print(random.choice(str1))

import random
p = ['A','B','C','D','E']
random.shuffle(p) #請注意其改變的是原序列 ,如果寫成print(random.shuffle(p)) 其返回值為None
print(p)


import random
lst = [1,2,3,4,5,6]
print(random.sample(lst,4))
print(lst)

import os
print(os.getcwd()) #獲取當前工作的路徑
print(os.listdir(r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day24'))

import os

print(os.listdir(r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day24'))
os.remove('log.py')
print(os.listdir(r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day24'))
print(os.path.split('C:\\Users\\Lenovo.LAPTOP-C8NNKEAA\\PycharmProjects\\learn_python\\abc.txt'))

import os
print(os.path.isdir(os.getcwd())) #返回結果為:True 判斷是否是一個目錄
print(os.path.isfile('abc.txt')) #返回結果為:True 判斷是否是一個檔案
print(os.path.exists(os.getcwd())) #返回結果為:True 判斷目錄是否真實存在
print(os.path.exists('log.py')) #返回結果為:False 判斷目錄是否真實存在
print(os.path.abspath('abc.txt'))
#返回結果為:C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day24\abc.txt 獲取檔案的絕對路徑
print(os.path.dirname('C:\\Users\\Lenovo.LAPTOP-C8NNKEAA\\PycharmProjects\\learn_python\\day24\\abc.txt'))
#返回結果為:C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day24 返回檔案路徑
print(os.path.splitext('a.txt')) #輸出結果為:('a', '.txt') 分離檔名和拓展名
print(os.path.join('c:\\Python','a.txt')) #輸出結果為:c:\Python\a.txt 將目錄和檔名拼接起來
print(os.path.basename('c:\\Python\\a.txt')) #輸出結果為:a.txt 返回檔名


import sys
print(sys.path)



for item in sys.path:
print(item)

#加密
import hashlib
obj = hashlib.md5('adqdacadreqfdc'.encode('utf-8'))
obj.update('小馬過河'.encode('utf-8'))
print(obj,type(obj))
result = obj.hexdigest()
print(result)
#沒加鹽前的結果:24f67b0f6d02adc8867d612e0e0fc40a
#加鹽後的結果:ace8fb02291cbcdd04a436b3b6e8f2ed


用hashlib做成加密函式
import hashlib
def get_md5(data):
obj = hashlib.md5('adsjklaoenxadw'.encode('utf-8'))
obj.update('小馬過河'.encode('utf-8'))
result = obj.hexdigest()
return result

val = get_md5('1234353')
print(val)


應用場景案例:使用者賬號密碼登入,對明文密碼進行加密
import hashlib
USER_LIST= []
def get_md5(data):
obj = hashlib.md5('adsjklaoenxadw'.encode('utf-8'))
obj.update('小馬過河'.encode('utf-8'))
result = obj.hexdigest()
return result

def register():
while True:
print('******************使用者註冊******************')
name = input('請輸入使用者名稱:')
if name.upper()=='N':
return
pwd = input('請輸入密碼:')
tmp = {'username':name,'password':get_md5(pwd)}
USER_LIST.append(tmp)

def login():
print('******************使用者登入******************')
name = input('請輸入使用者名稱:')
pwd = input('請輸入密碼:')
for item in USER_LIST:
if item['username'] ==name and item['password'] ==get_md5(pwd):
return True

register()
result = login()
print(result)
if result:
print('恭喜你登入成功')
else:
print('登入失敗')