一起學Python吧~Day09

大家在一起學python相愛相殺也小十天了,知道大家很累,但是沒有苦哪有甜呢?爲了心中的它(夢想)和她(對象)所以請關注阿坤一起哭着學下去吧!

#!/bin/env python3
#-*- coding:utf8 -*-
#學python3的第9天
#注意:寫程序要解耦(不可藕斷絲連)
#標準版的記賬程序
# import os
# import pickle
# from time import strftime
#
#
# def save(fname):
#     amount = int(input('金額: '))
#     comment = input('備註: ')
#     date = strftime('%Y-%m-%d')
#     # 從文件中取出全部記錄
#     with open(fname, 'rb') as fobj:
#         records = pickle.load(fobj)
#     # 計算最新餘額
#     balance = records[-1][-2] + amount
#     record = [date, amount, 0, balance, comment]
#     records.append(record)
#     # 把更新後的列表再次存入文件
#     with open(fname, 'wb') as fobj:
#         pickle.dump(records, fobj)
#
# def cost(fname):
#     amount = int(input('金額: '))
#     comment = input('備註: ')
#     date = strftime('%Y-%m-%d')
#     # 從文件中取出全部記錄
#     with open(fname, 'rb') as fobj:
#         records = pickle.load(fobj)
#     # 計算最新餘額
#     balance = records[-1][-2] - amount
#     record = [date, 0, amount, balance, comment]
#     records.append(record)
#     # 把更新後的列表再次存入文件
#     with open(fname, 'wb') as fobj:
#         pickle.dump(records, fobj)
#
# def query(fname):
#     # 取出全部的記錄
#     with open(fname, 'rb') as fobj:
#         records = pickle.load(fobj)
#
#     # 打印表頭
#     print(
#         '%-12s%-8s%-8s%-12s%-20s' % ('date', 'save', 'cost', 'balance', 'comment')
#     )
#     # 打印記錄
#     for record in records:
#         print('%-12s%-8s%-8s%-12s%-20s' % tuple(record))
#
# def show_menu():
#     cmds = {'0': save, '1': cost, '2': query}
#     prompt = """(0) save
# (1) cost
# (2) query
# (3) quit
# Please input your choice(0/1/2/3): """
#     fname = 'account.data'
#     init_data = [
#         [strftime('%Y-%m-%d'), 0, 0, 10000, 'init data']
#     ]
#     # 如果文件不存在,把初始化數據寫進去
#     if not os.path.exists(fname):
#         with open(fname, 'wb') as fobj:
#             pickle.dump(init_data, fobj)
#
#     while 1:
#         choice = input(prompt).strip()
#         if choice not in ['0', '1', '2', '3']:
#             print('無效的輸入,請重試。')
#             continue
#
#         if choice == '3':
#             print('\nBye-bye')
#             break
#
#         cmds[choice](fname)
#
# if __name__ == '__main__':
#     show_menu()
# #改良版本
# import os
# import pickle
# from time import strftime
#
#
# def save(fname):
#     try: #異常情況處理
#         amount = int(input('\033[33;1m金額: \033[0m').strip())
#         comment = input('\033[33;1m備註: \033[0m').strip()
#     except ValueError as echo:
#         print('\033[33;1mInvalid input: %s\033[0m' % echo)
#     except (KeyboardInterrupt, EOFError):
#         print('\n\033[32mBye-bye\033[0m')
#         print('\n\033[32mDone\033[0m')
#         exit()
#     else:
#         date = strftime('%Y-%m-%d')
#         # 從文件中取出全部記錄
#         with open(fname, 'rb') as fobj:
#             records = pickle.load(fobj)
#         # 計算最新餘額
#         balance = records[-1][-2] + amount
#         record = [date, amount, 0, balance, comment]
#         records.append(record)
#         # 把更新後的列表再次存入文件
#         with open(fname, 'wb') as fobj:
#             pickle.dump(records, fobj)
#     finally:
#         print(strftime('\033[35;1m%Y-%m-%d %H:%M:%S\033[0m'))
#
# def cost(fname):
#     try:
#         amount = int(input('\033[33;1m金額: \033[0m').strip())
#         comment = input('\033[33;1m備註: \033[0m').strip()
#     except ValueError as echo:
#         print('\033[33;1mInvalid input: %s\033[0m' % echo)
#     except (KeyboardInterrupt, EOFError):
#         print('\n\033[32mBye-bye\033[0m')
#         print('\n\033[32mDone\033[0m')
#         exit()
#     else:
#         date = strftime('%Y-%m-%d')
#         # 從文件中取出全部記錄
#         with open(fname, 'rb') as fobj:
#             records = pickle.load(fobj)
#         # 計算最新餘額
#         balance = records[-1][-2] - amount
#         record = [date, 0, amount, balance, comment]
#         records.append(record)
#         # 把更新後的列表再次存入文件
#         with open(fname, 'wb') as fobj:
#             pickle.dump(records, fobj)
#     finally:
#         print(strftime('\033[35;1m%Y-%m-%d %H:%M:%S\033[0m'))
#
#
# def query(fname):
#     # 取出全部的記錄
#     with open(fname, 'rb') as fobj:
#         records = pickle.load(fobj)
#
#     # 打印表頭
#     print(
#         '\033[35;1m%-12s%-8s%-8s%-12s%-20s\033[0m' % (
#             'date', 'save', 'cost', 'balance', 'comment'
#         )
#     )
#     # 打印記錄
#     for record in records:
#         print('\033[36;1m%-12s%-8s%-8s%-12s%-20s\033[0m' % tuple(record))
#     print(strftime('\033[35;1m%Y-%m-%d %H:%M:%S\033[0m'))
#
# def show_menu():
#     cmds = {'0': save, '1': cost, '2': query}
#     prompt = """\033[32;1m(0) save
# (1) cost
# (2) query
# (3) quit
# Please input your choice(0/1/2/3):\033[0m """
#     fname = 'account.data'
#     init_data = [
#         [strftime('%Y-%m-%d'), 0, 0, 10000, 'init data']
#     ]
#     # 如果文件不存在,把初始化數據寫進去
#     if not os.path.exists(fname):
#         with open(fname, 'wb') as fobj:
#             pickle.dump(init_data, fobj)
#
#     while True:
#         try:
#             choice = input(prompt).strip() #加了下標就得用IndexError報錯
#         except (ValueError,IndexError) as echo:
#             print('\033[33;1mInvalid input: %s\033[0m' % echo)
#         except (KeyboardInterrupt, EOFError):
#             print('\n\033[32mBye-bye\033[0m')
#             print('\n\033[32mDone\033[0m')
#             print(strftime('\033[35;1m%Y-%m-%d %H:%M:%S\033[0m'))
#             exit()
#         else:
#             if choice not in ['0', '1', '2', '3']:
#                 print('\033[33;1mInvalid input,Try again.\033[0m')
#                 continue
#             if choice == '3':
#                 print('\n\033[32mBye-bye\033[0m')
#                 break
#             cmds[choice](fname)
#
#
#
# if __name__ == '__main__':
#     show_menu()

# #函數引用問題
# def funch1():
#     print('funch 1')
#     funch2()
#
# def funch2():
#     print('funch 2')
#
# if __name__ == '__main__':
#     funch1() #完全沒問題
# #函數參數
# def func1(name,age):
#     print('%s is %s years old.'% (name,age))
#
# func1('bob',20) #OK
# func1(20,'bob') #語法ok 語義不對
# func1(age=20,name='bob') #OK
# func1(age=20,'bob') #語法錯誤 關鍵字必須在後
# func1(20,name=bob) #Error,name得到了多個值
# func1('bob',age=20) #OK

# #定義參數
# def func1(*args): #變量名前加*可以吧變量變成元組從而達到傳多個參數目的
#     print(args)
#
# func1('hao')
# func1('hao',123)
# func1('hao',123,'bob','alice')
#
# def func2(**kwargs):  #**變成字典傳參方式key-value支持多個
#     print(kwargs)
#
# func2()
# func2(name='bob')
# func2(name='bob',age=20)

#傳參
"""
傳參時 *表示把序列對象拆開
傳參試 **表示把字典對象拆開
"""
# def funcation(x,y):
#     return x + y
#
# nums = [10,20]
# funcation(*nums) #funcation(10,20)
#
# def funcation2(name,age):
#     print('%s is %s years old.'% (name,age))
#
# adict = {'name': 'alice','age': 18}
# funcation2(**adict) #funcation2(name='alice',age=18)

# #案例:計數遊戲
# from random import randint,choice
#
# def add(x,y):
#     return x + y
#
# def sub(x,y):
#     return x + y
#
# def exam():
#     cmds = {'+': add,'-': sub}
#     nums = [randint(1,100)for i in range(2)]
#     nums.sort(reverse=True) #降序排列
#     op = choice('+-') #choice隨機選擇一個(詳細用法看隨機密碼筆記)
#     #計算標準答案
#     result = cmds[op](*nums) #*可拆分列表
#
#     #提示語,即算式
#     prompt = '%s %s %s = ' % (nums[0],op,nums[1])
#     counter = 0
#     while counter < 3:
#         try:
#             answer = int(input(prompt).strip()[0])
#         except (ValueError,IndexError) as echo:
#             print('Invalid input,Try again: %s' % echo)
#         except (KeyboardInterrupt, EOFError):
#             print('\nBye-bye')
#             print('\nDone')
#             exit()
#         else:
#             if answer == result:
#                 print('Very Good!!!')
#                 break
#             print('Result Error.')
#             counter += 1
#     else:
#         print('%s%s' % (prompt,result))
#
# def main():
#     while True:
#         try:
#             exam()
#             user = input('Continue(y/n)? ').strip()[0]
#         except (ValueError, IndexError) as echo:
#             print('Invalid input,Try again: %s' % echo)
#         except (KeyboardInterrupt,EOFError):
#             print('\nBye-bye')
#             print('\nDone')
#             exit()
#         else:
#             if user in 'nN':
#                 print('\nBye-bye')
#                 break
#
#
# if __name__ == '__main__':
#     main()

# #匿名函數
# #lambda高階函數用法(匿名函數:跟普通函數一樣的效果)
# def add(x,y):
#     return  x + y
# print(add(5,10))
# #可以改寫爲下面的
# myadd = lambda x, y: x + y
# print(myadd(10,5))
# #實際例子:
# from random import randint, choice
#
# def exam():
#     cmds = {'+': lambda x, y: x + y, '-': lambda x, y: x - y}
#     nums = [randint(1, 100) for i in range(2)]
#     nums.sort(reverse=True)  # 降序排列
#     op = choice('+-')
#     # 計算標準答案
#     result = cmds[op](*nums)
#
#     # 提示語,即算式
#     prompt = '%s %s %s = ' % (nums[0], op, nums[1])
#     counter = 0
#     while counter < 3:
#         try:
#             answer = int(input(prompt))
#         except:  # 可以捕獲所有異常,但是不推薦
#             print()
#             continue
#
#         if answer == result:
#             print('Very Good!!!')
#             break
#         print('不對喲!!!')
#         counter += 1
#     else:
#         print('%s%s' % (prompt, result))
#
# def main():
#     while 1:
#         exam()
#         try:
#             yn = input('Continue(y/n)? ').strip()[0]
#         except IndexError:
#             yn = 'y'
#         except (KeyboardInterrupt, EOFError):
#             yn = 'n'
#
#         if yn in 'nN':
#             print('\nBye-bye')
#             break
#
# if __name__ == '__main__':
#     main()

#高階函數filter(高階函數處理的數據只能print一次 第二次爲空:高階函數又稱生成器:只能取一次值)
"""
- 它接受兩個參數。filter(func, seq)
- 第一個參數是函數,如func
- 第二個參數是序列對象
- func它必須接受一個參數,返回值必須是True或False
- filter函數工作時,將序列對象中的每個值作爲func的參數進行過濾,結果爲真的保留,爲假的捨棄
"""
# #舉例子
# from random import  randint
#
# def funcation(x):
#     return x % 2  #效果和下邊等同
#     #return  True if x % 2 == 1 else False
#
# if __name__ == '__main__':
#     nums = [randint(1,100) for i in range(10)]
#     print(nums)
#     result = filter(funcation,nums)
#     print(list(result)) #篩選出來基數
#     result2 = filter(lambda x: not x % 2, nums) #匿名函數與上方正常函數效果一樣
#     print(list(result2)) #篩選出來偶數
#     print(list(result2)) #二次print爲空
#     print(set(nums))

#map函數
"""
- 它接受兩個參數。map(func, seq)
- 第一個參數是函數,如func
- 第二個參數是序列對象
- func它必須接受一個參數,它將接收到的數據進行處理,然後返回
"""
# from random import  randint
#
# def funcation2(x):
#     return x * 2
#
# if __name__ == '__main__':
#     nums = [randint(1,100) for i in range(10)]
#     print(nums)
#     result3 = map(funcation2,nums)
#     print(list(result3))
#     result4 = map(lambda x: x * 2,nums)
#     print(list(result4))
#****************

# #變量
# """
# - 在函數外面定義的變量是全局變量。全局變量從定義開始,到程序結束,任意地方可見可用。
# """
# #****global
# x = 10
# def funcation():
#     print(x)
# #                   ******優先級global>local*****
# print(funcation())
# """
# - 在函數內定義的變量是局部變量。局部變量只能在函數內部使用。
# """
# #****local
# def funcation2():
#     y = 5
#     print(y)
# """
# - 如果局部和全局有同名變量。局部變量將會遮蓋住全局變量。
# """
# y = 10
# def funcation3():
#     y = 5
#     print(y)
# """
# - 如果希望通過函數改變全局變量,需要使用關鍵字global
# """
# #global使用
# def funcation4():
#     global x   #不再是local而是global了
#     x = 100000
#     print(x)
#

#偏函數:固參
"""
- 改造現有函數,生成新函數
- 改造時,可以將現有函數的一些參數固定
"""
# def funcation5(a,b,c,d,e): #函數必須有五個參數
#     return a + b + c + d + e
# print(funcation5(10 ,20 ,30 ,40 ,2)) #每次傳參 前4個數固定
#
# from functools import partial
#
# myadd = partial(funcation5,10, 20, 30, 40)
# print(myadd(2))
#
# int2 = partial(int,base=2)  #修改int函數固定base=2值 生成新函數int2(二進制轉換十進制)
# print(int2('10')) #2

# #案例2: GUI
# #tkinter 窗口模塊
# import tkinter
# root = tkinter.Tk()

#遞歸函數
#數字階乘:自己調用自己
"""
5! = 5x4x3x2x1
"""
# def funcation(x):
#     if x == 1:
#         return 1
#     return x * funcation(x - 1)
#
# print(funcation(5)) #120
"""函數流程
5*funcation(4)
 4*funcation(3)
  3*funcation(2)
   2*funcation(1)
    1
"""

#快速排序
# from random import  randint
#
# def quickly_sort(seq):
#     #如果對象的長度是0或1 那麼直接返回 不用在排序
#     if len(seq)<2:
#         return seq
#     #假設第一個數是中間值 比他小的放到一個列表
#     #比他大的放到另一個列表
#     middle = seq[0]
#     smaller = []
#     larger = []
#     for i in seq[1:]:
#         if i  <= middle:
#             smaller.append(i)
#         else:
#             larger.append(i)
#     #把各項從小到大拼接 如果對列表繼續進行排序
#     return quickly_sort(smaller) + [middle] + quickly_sort(larger)
#
# if __name__ == '__main__':
#     nums = [randint(1,100) for i in range(10)]
#     print(nums)
#     print(quickly_sort(nums))

#生成器:直接把列表解析變成()即可 且只能取一次值
"""
  - 可以通過生成器表達式得到生成器
"""
# from random import randint
#
# nums = (randint(1,100) for i  in range(10))
# for i in nums:
#     print(i)

#使用函數的形式
"""
  - 常規函數通過return返回一個最終結果
  - 生成器通過yield語句,返回多箇中間結果
"""
# def mygen():
#     yield 10
#     a = 100 +5
#     yield a
#     yield 200
#
# mg = mygen()
# print(list(mg))
# print(list(mg)) #再次取值就爲空[]

#模塊
"""導入模塊時,python到指定路徑下搜尋
- sys.path定義的路徑
- PYTHONPATH環境變量定義的路徑

"""

# import sys #導入以第一次爲準 如果修改了需要退出python重新導入!!
#
# print(sys.path) #查看all變量目錄

"""終端操作
#cp qsort.py /var/tmp
#cd /tmp/
#python
>>>import qsort  //報錯
#export PYTHONPATH = /var/tmp
#python
>>>import qsort  //成功
"""

#tarfile壓縮文件模塊
"""

"""
# #創建壓縮文件
# import  tarfile
#
# tar = tarfile.open('/tmp/mytest.tar.gz','w:gz')
# tar.add('/etc/hosts') #tar /etc/hosts
# tar.close()
# #解壓,打開時不用指定壓縮格式(程序會自動判斷)
# tar = tarfile.open('/tmp/mytest.tar.gz')
# tar.extractall(path='/var/tmp') #解壓到制定的目錄 默認當前路徑
# tar.close()
#
# #計算數據的哈希值
# import hashlib
# m = hashlib.md5(b'123456')
# m.hexdigest()
# 'e10adc3949ba59abbe56e057f20f883e'
#
# with open('/etc/passwd', 'rb') as fobj:
#     data = fobj.read()
#
# m = hashlib.md5(data)
# m.hexdigest()
# '687950834a69d8e7ab0ba9e9111eeb1f'
#
# m = hashlib.md5()
# m.update(b'12')
# m.update(b'34')
# m.update(b'56')
# m.hexdigest()
# 'e10adc3949ba59abbe56e057f20f883e'



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章