大家在一起學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'