我的Python學習之路(一)
- 跟著廖雪峰的Python教程學習
- Task 1:輸入和輸出
- Task 2:打印變量
- Task 3:格式化輸出
- Task 4:按要求打印tuple元素
- Task 5:if分支練習
- Task 6:循環練習
- Task 7:調用函數
- Task 8:定義函數
- Task 9:可變參數
- Task 10:遞歸函數實現
- Task 11:切片練習
- Task 12:迭代練習
- Task 13: 列表生成式練習
- Task 14:生成器練習
- Task 15:map/reduce
- Task 16:Filter練習
- Task 17:sorted練習
- Task 18:返回函數
- Task 19:匿名函數
- Task 20:裝飾器
- Task 21:類和實例練習
- Task 22: 訪問限制練習
- Task 23:實例屬性和類屬性
- Task 24: @property練習
- Task 25: 定制類練習
- Task 26:枚舉類練習
- Task 27:練習metaclass[ORM框架] **重要的高級知識點
- Task 28:錯誤處理練習
- 明日練習:調試 練習
跟著廖雪峰的Python教程學習
date:2019-06-25
從今天開始,我開始跟著廖雪峰的Python教程 學習Python,并將習題放到這兒,以便時時復習。
Task 1:輸入和輸出
#!/usr/bin/env python3
# -*- codeing: utf-8 -*-
#bypython
print('1024*768=',1024*768)
print('1024*768=%10d'%(1024*768))
print('1024*768=%010d'%(1024*768))
Task 2:打印變量
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
n = 123
f = 456.789
s1 = 'Hello, world'
s2 = 'Hello, \'Adam\''
s3 = r'Hello, "Bart"'
s4 = r'''Hello,
Lisa!'''
print('n=%d f=%.3f'%(n,f))
print(s1)
print('%s'%s2)
print(s3)
print(s4)
print(n,f,s1,s2,s3,s4)
Task 3:格式化輸出
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
s1 = 72
s2 = 85
r = (s2-s1)/s1
print('%.1f%%' % r)
Task 4:按要求打印tuple元素
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
L = [
['Apple', 'Google', 'Microsoft'],
['Java', 'Python', 'Ruby', 'PHP'],
['Adam', 'Bart', 'Lisa']
]
# 打印Apple:
print('%s'%L[0][0])
# 打印Python:
print('%s'%L[1][1])
# 打印Lisa:
print('%s'%L[2][2])
Task 5:if分支練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
height = 1.75
weight = 80.5
bmi = weight/height**2
if bmi < 18.5:
print('過輕')
elif bmi < 25:
print('正常')
elif bmi < 28:
print('過重')
elif bmi < 32:
print('肥胖')
else:
print('嚴重肥胖')
Task 6:循環練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
L = ['Bart', 'Lisa', 'Adam']
for name in L:
print('Hello, %s!'%name)
i = 0
while i < len(L):
print('Hello, %s!'%L[i])
i = i+1
Task 7:調用函數
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
n1 = 255
n2 = 1000
print(hex(n1))
print(hex(n2))
print('0x%04X'%n1)
print('0x%04X'%n2)
Task 8:定義函數
請定義一個函數quadratic(a, b, c),接收3個參數,返回一元二次方程 ax2+bx+c=0ax^2+bx+c=0ax2+bx+c=0 的兩個解。
提示:
一元二次方程的求根公式為:
x=?b±b2?4ac2ax=\frac{-b\pm\sqrt{b^2-4ac}}{2a}x=2a?b±b2?4ac
計算平方根可以調用math.sqrt()函數:
>>> import math
>>> math.sqrt(2)
1.4142135623730951
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import math
def quadratic(a, b, c):
if (b**2 - 4*a*c) < 0:
return None,None
return ( (-b+math.sqrt(b**2 - 4*a*c))/(2*a), (-b-math.sqrt(b**2 - 4*a*c))/(2*a))
Task 9:可變參數
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def product(x, *y):
pro = x
for val in y:
pro = pro*val
return pro
Task 10:遞歸函數實現
由于之前漢諾塔的解決方案忘了,因此此函數未寫出來
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
#print("move(%d, %s,%s,%s)"%(n,a,b,c))
Task 11:切片練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def trim(s):
if len(s) == 0:
return ''
flg = False
if s[0] == ' ':
s = s[1:]
flg = True
if s[-1] == ' ':
s = s[:-1]
flg = True
if flg :
s = trim(s)
return s
Task 12:迭代練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def findMinAndMax(L):
min = None
max = None
for val in L:
if min == None or val < min:
min = val
if max == None or val > max :
max = val
return (min, max)
Task 13: 列表生成式練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if isinstance(s, str)]
Task 14:生成器練習
沒有得到最簡方式,找到的最簡方式
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def triangles():
p = [1]
while True:
yield p
p =[1]+[p[x]+p[x+1] for x in range(len(p)-1)]+[1]
date:2019-6-26
Task 15:map/reduce
以下我認為是最簡潔的函數,我自己由于對Python不熟,沒有想到用切片來做
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def normalize(name):
return name[0].upper() + name[1:].lower()
#return name.capitalize() //首字母大寫函數
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def prod(L):
def prod2(x, y):
return x*y
return reduce(prod2, L)
#return reduce(lambda x,y:x*y, L)
#!/usr/bin/env python3
# -*- coding: utf-8 -*
from functools import reduce
def str2float(s):
#TODO:這里應該判定全是數值
index = s.find('.')
if index == -1:
return int(s)
fl = len(s[index+1:])
return int(s[:index])+int(s[index+1:])/(10**fl)
Task 16:Filter練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*
def is_palindrome(n):
s = str(n)
strlen = len(s)
flg = True
for i in range(0, strlen//2):
if s[i] != s[strlen - i-1]:
flg = False
break
return flg
date:2019-6-27
Task 17:sorted練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0]
def by_score(t):
return t[1]
L2 = sorted(L, key=by_name)
print(L2)
L2 = sorted(L, key=by_score)
print(L2)
Task 18:返回函數
注:此節學習到作用域聲明,雖然閉包可以使用外層作用域變量,但是如果要修改外部變量的值,也是需要聲明變量是外層作用域或者全局變量的,如果修改的變量是list,則不用聲明
可使用 nonlocal 或者 global 關鍵字,推薦使用 nonlocal.并且如果使用的是global,內部聲明也需要使用global
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def createCounter():
i = 0
def counter():
nonlocal i
i += 1
return i
return counter
Task 19:匿名函數
# -*- coding: utf-8 -*-
def is_odd(n):
return n % 2 == 1
L = list(filter(lambda n:n%2==1, range(1, 20)))
Task 20:裝飾器
附加知識:時間庫 獲取當前時間 time.time() 單位秒 結果為浮點數
# -*- coding: utf-8 -*-
import time, functools
def metric(fn):
@functools.wraps(fn)
def wrapper(*args, **kw):
t1 = time.time()*1000
res = fn(*args, **kw)
t2 = time.time()*1000
print('%s executed in %s ms' % (fn.__name__, int(t2-t1)) )
return res
return wrapper
熟悉第三方工具 Anaconda+PyCharm
Task 21:類和實例練習
在PyCharm中,發現工具會嚴格檢查編碼規范,因此了解了以下編碼規范
另外如果不加括號(如下),不會調用__init__函數
class Student(object):
count = 0
def __init__(self):
Student.count = Student.count + 1
self._name = ''
print(Student.count)
a = Student()
# 錯誤示范 這樣沒有調用_init__函數
a = Student
print(Student.count)
b = Student()
print(Student.count)
Task 22: 訪問限制練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Student(object):
def __init__(self, name, gender):
self.__name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self, val):
self.__gender = val
Task 23:實例屬性和類屬性
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Student(object):
count = 0
def __init__(self, name):
self.name = name
Student.count = Student.count + 1
Task 24: @property練習
class Screen(object):
def __init__(self):
self.__width = 0
self.__height = 0
@property
def width(self):
return self.__width
@width.setter
def width(self, val):
self.__width = val
@property
def height(self):
return self.__height
@height.setter
def height(self, val):
self.__height = val
@property
def resolution(self):
return self.__width*self.__height
Task 25: 定制類練習
在本章中,由于在PyCharm中運行網站實例出現了,在最后測試Fib for循環輸出時遇到死在其中不能退出,經過調試發現不知道為什么,for循環沒有處理StopIteration異常,自己處理異常成功測試完成
求助得到,竟然是因為 使用了return異常,而不是raise異常,個人使用的PyCharm的沒有提示警告
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Student(object):
def __init__(self, name):
self.__name = name
def __str__(self):
return 'Object:Student(name:%s)'%self.__name
__repr__ = __str__
# 測試 __str__
print(Student('Michael'))
# 分割
class Fib(object):
def __init__(self):
self.__a, self.__b = 0, 1 # 初始化兩個計數器 a,b
def __iter__(self):
return self # 實例本身是迭代對象
def __next__(self):
self.__a, self.__b = self.__b, self.__a + self.__b
if self.__a > 100: # 設置退出循環的條件
raise StopIteration()
# return StopIteration()
return self.__a # 返回下一個值
def __getitem__(self, idx):
__a, __b = 1, 1
for x in range(idx):
__a, __b = __b, __a + __b
return __a
# 測試__iter__,__getitem__
for n in Fib():
if isinstance(n, StopIteration):
break
else:
print(n)
f = Fib()
print(f[0])
print(f[1])
print(f[2])
print(f[3])
print(f[4])
date:2019-7-6 由于出差一周,之前一直沒空學習 今天繼續
Task 26:枚舉類練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May'
, 'Jun', 'Jul', 'Aug', 'Sep', 'Oct'
, 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
from enum import unique
@unique
class Weekday(Enum):
Sun = 0 #除了默認值外也可以指定枚舉為對應的值
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
day1 = Weekday.Mon
print(day1)
print(Weekday.Tue)
print(Weekday['Tue'])
print(Weekday.Tue.value)
print(day1 == Weekday.Mon.value)
print(day1 == Weekday.Tue.value)
print(Weekday(1))
print(day1 == Weekday(1))
class Gender(Enum):
Male = 0
Female = 1
class Student(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
# 測試:
bart = Student('Bart', Gender.Male)
if bart.gender == Gender.Male:
print('測試通過!')
else:
print('測試失敗!')
Task 27:練習metaclass[ORM框架] **重要的高級知識點
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Field(object):
def __init__(self, name, column_type):
self.name = name
self.column_type = column_type
def __str__(self):
return '<%s:%s>'%(self.name, self.column_type)
class StringField(Field):
def __init__(self, name):
super(StringField, self).__init__(name, 'varchar(100)')
class IntegerField(Field):
def __init__(self, name):
super(IntegerField, self).__init__(name, 'bigint')
class ModelMetaclass(type):
def __new__(cls, name, bases, attrs):
if name=='Model':
return type.__new__(cls, name, bases, attrs)
print('Fount Model:%s'%name)
mappings = dict()
for k, v in attrs.items():
if isinstance(v, Field):
print('Found mapping:%s ==> %s'%(k, v))
mappings[k] = v
for k in mappings.keys():
attrs.pop(k)
attrs['__mappings__'] = mappings #保存屬性和映射關系
attrs['__table__'] = name #假設表名與類名一致
return type.__new__(cls, name, bases, attrs)
class Model(dict, metaclass=ModelMetaclass):
def __init__(self, **kv):
super(Model, self).__init__(**kv)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Model' Obejct has no attribute '%s'"
%key)
def __setattr__(self, key, value):
self[key] = value
def save(self):
fields = []
params = []
args = []
for k, v in self.__mappings__.items():
fields.append(v.name)
params.append('?')
args.append(getattr(self, k, None))
sql = 'insert into %s(%s) value (%s)'\
%(self.__table__, ','.join(fields), ','.join(params))
print('SQL: %s'%sql)
print('ARGS: %s'%str(args))
class User(Model):
# 定義類的屬性到列的映射:
id = IntegerField('id')
name = StringField('username')
email = StringField('email')
password = StringField('password')
# 創建一個實例:
u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')
# 保存到數據庫:
u.save()
date:2019-7-7
Task 28:錯誤處理練習
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
from functools import reduce
try:
print('try...')
r = 10/0
print('result:', r)
except ZeroDivisionError as e:
print('Except:', e)
finally:
print('finally...')
print('END')
try:
print('try...')
r = 10/int('a')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('Except:', e)
else:
print('no error')
finally:
print('finally...')
print('END')
try:
print('try...')
r = 10/int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except ZeroDivisionError as e:
print('Except:', e)
else:
print('no error')
finally:
print('finally...')
print('END')
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
def str2num(s):
return int(s)
def calc(exp):
ss = exp.split('+')
ns = map(str2num, ss)
return reduce(lambda acc, x: acc + x, ns)
def lmain():
r = calc('100 + 200 + 345')
print('100 + 200 + 345 =', r)
r = calc('99 + 88 + 7.6')
print('99 + 88 + 7.6 =', r)
lmain()
明日練習:調試 練習
調試 練習
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
