一起學Python吧~Day03

#!/bin/env python3
#-*- coding:utf8 -*-
#學python3的第三天
#python打開文件
#open默認以讀的方式打開,文件不存在則報錯
# f = open('/tmp/mima')
# print(f)
# #將內容讀取出來,賦值給data
# data = f.read()
# print(data)
# data = f.read() #繼續向後讀,因爲全部內容已經讀完所以後面呈現爲空
# print(data) #如果不用print看的話就有點亂
# #關閉文件
# f.close() #關閉後再打開就又從頭開始讀了
# f = open('/tmp/mima') #重新打開
# print(f.read(1)) #讀取1字節
# print(f.read(3)) #繼續讀3個字節
# print(f.readline()) #從文件指針開始,讀一行
# print(f.readlines()) #將剩餘部分讀到列表中,每一行是列表的一項
# print(help(f.readlines())) #看幫助
# print(f.readlines(-1)) #查看全部\
#以上了解一下即可
#***重要: 文本文件一般採用的方式是for循環遍歷***
# f = open('/tmp/mima')
# for line in f:
#     print(line,end='')
# f.close()
#************************************************

# f = open('/tmp/ls') #cp /bin/ls /tmp/ls
# # print(f.read(10)) #打開文本文件直接報錯
# f = open('/tmp/ls','rb') #r是讀,b是bytes
# print(f.read(10))
# f.close()
#
# #寫入文件的兩種方法.注意: 以w 方式打開文件,會將文件清空
# #1)
# f = open('/tmp/mima','w')
# print(f.write('hello world!\n')) #寫入了13字節
# f.flush() #非必須操作(當沒達到默認4K磁盤不會寫入,先存着,這時需要刷新一下才會立刻寫入)
# #2)
# f.writelines(['2nd line.','new aaa\n','3rd line.\n']) #另一種寫入
# f.close()
# #打開一個不存在的文件會創建
# f = open('/tmp/aaaa','wb')
# # print(f.write('你好')) #直接寫漢字會報錯,就像圖片裏的子不能複製一樣
# hi = '你好\n' #漢字賦值
# print(hi.encode()) #然後轉換成二進制,在utf8一個漢字默認佔3個字節(byte),\n佔1個字節
# print(f.write(hi.encode())) #共寫入7個字節
# f.close() #關文件好習慣!(不管一般沒什麼後果)
#*****************************************************************
# #with語句(防止忘了管文件)
# #通過with語句文件自動關閉,
# with open('/tmp/mima') as f:
#     f.readline() #執行完文件自動關閉
#print(f.readline()) #此時在讀就報錯,因爲文件已經關閉
#******************************************************************************
'''
seek 可以在不關閉文件的情況下移動指針,
它有兩個參數,第二個參數是相對位置,0表示開頭,1表示當前指針位置
2表示結尾;第一個參數是偏移量
'''
# f = open('/tmp/mima')
# print(f.tell()) #總是顯示距離開頭多少字節,剛打開距離爲0
# print(f.seek(6,0)) #移動6個,0是相對位置(開頭是0,從0開始),6是偏移量(所在位置)
# print(f.read(5)) #在讀5個
# print(f.tell()) #讀到11個位置了(從0開始讀的所以不是12是11)
# f.close()
#複製cp操作cp.py
#代碼問題:
#不建議硬編碼
#變量名應該有意義
#
# f1 = open('/bin/ls','rb')
# f2 = open('/tmp/list','wb')
#
# data = f1.read()
# f2.write(data)
#
# f1.close()
# f2.close()

#改良版本
'''
while 1和while True區別
python2中True沒有做優化每次循環都會對其檢查 1被優化過不會檢查
python3中二者無區別
'''
# src_fname = '/bin/ls'
# dst_fname = '/tmp/list2'
#
# src_fobj = open(src_fname,'rb')
# dst_fobj = open(dst_fname,'wb')
#
# while 1:         #非文本文件用while(也能用於文本文件)
#     data = src_fobj.read(4096) #一般來說磁盤默認一塊磁盤讀寫大小爲4096
#     #if data == b'': #b表示bytes
#     #if len(data) == 0:
#     if not data: #空串爲假,取反爲真
#         break
#
#     dst_fobj.write(data)
#
# src_fobj.close()
# dst_fobj.close()
#*****************************************************
#函數:函數裝的都是代碼
'''
一組代碼的集合
'''
# #格式def fuction_name(option)
# #實例
# def pstar():
#     print('*'*30)
# pstar() #使用()進行函數調用(調用的都是代碼)
# a = pstar() #賦值給a函數調用完裏面是個None(函數返回值)
# #函數如果需要返回值,則使用return進行返回;沒用明確的語句,默認返回None
# print(a)
# #如果需要用到返回值那麼就需要用return進行返回
#函數返回值
# def add():
#     a = 10+5 #函數中的變量是局部變量並不是全局變量只能在函數中使用
#     return a #返回的是結果而不是過程
# n = add()
# print(n)
#參數(變量)
# #1)形式參數(形參:在定義函數是,函數名稱後面括號中的變量)
# def add(x,y):
#     return  x + y
# #2)實際參數:實參,調用函數時,傳遞給函數的參數
# print(add(5,5)) #傳參
# #自定義9*9函數
# def f(x):
#     for i in range(1,x + 1):
#         for j in range(1,i + 1):
#             print('%sx%s=%s'% (j,i,i*j),end=' ')
#         print()
# f(int(input('請輸入乘法表的範圍: ')))
# #函數改良copy並用input傳參
# def copy(src_fname,dst_fname):
#     src_fobj = open(src_fname,'rb')
#     dst_fobj = open(dst_fname,'wb')
#
#     while 1:         #非文本文件用while(也能用於文本文件)
#         data = src_fobj.read(4096) #一般來說磁盤默認一塊磁盤讀寫大小爲4096
#         #if data == b'': #b表示bytes
#         #if len(data) == 0:
#         if not data: #空串爲假,取反爲真
#             break
#
#         dst_fobj.write(data)
#
#     src_fobj.close()
#     dst_fobj.close()
#
# copy(input('sourcedir: '),input('distination: '))
# #位置參數
# #python將命令行上的位置參數,保存到了sys模塊的argv列表中
# import sys
#
# print(sys.argv) #位置參數接收的全部是字符類型
# #用位置參數傳參
# import  sys
#
# def copy(src_fname,dst_fname):
#     src_fobj = open(src_fname,'rb')
#     dst_fobj = open(dst_fname,'wb')
#
#     while 1:         #非文本文件用while(也能用於文本文件)
#         data = src_fobj.read(4096) #一般來說磁盤默認一塊磁盤讀寫大小爲4096
#         #if data == b'': #b表示bytes
#         #if len(data) == 0:
#         if not data: #空串爲假,取反爲真
#             break
#
#         dst_fobj.write(data)
#
#     src_fobj.close()
#     dst_fobj.close()
#
# if len(sys.argv) != 3:
#     print('Usage: %s [src] [dst]'% sys.argv[0])
#     exit(250) #程序遇到exit就會徹底結束,1是$?的值
# else:
#     copy(sys.argv[1],sys.argv[2])
# #函數應用:斐波那契數列
# def gen_fib(l):
#     fib = [0,1]
#
#     for i in range(l - len(fib)): #range不包括結束的數字,例如輸入5則range[0,1,2]
#         fib.append(fib[-1]+fib[-2])
#
#     return  fib #返回列表,不返回變量fib
# print(gen_fib(int(input('請輸入所需列表[0,1]位數: '))))
# #具有默認值的參數
# def pstar():
#     print('*'*30)
# pstar() #只能打印30個*

# def pstar(n): #傳參,n的值就是*號的個數
#     print('*'*n)
# pstar(int(input('n= ')))
#a = input('請輸入數字:')

# import sys
#
# def pstar(n=30): #提供默認參數
#     print('*'*n)
#
# if len(sys.argv) != 2:
#     pstar()
#     exit(1)
# pstar(int(sys.argv[1]))


# #模塊導入方法
# import time #常用導入方法
# time.ctime()
#
# from random import  randint,choice #從模塊中導入一部分功能:常用
# print(randint(1,100))
# print(choice('abcd'))

# #一行導入多個模塊,不常用,因爲可讀性差
# import os,sys
# #導入模塊的同時,爲模塊創建別名,不常用
# import getpass as gp
# p = gp.getpass()

#自定義模塊
'''
#vim star.py //自定義star模塊
hi = 'hello world'

def pstar(n=30):
    print('*' * n)
#vim call_star.py
import star

print('this is call_star')
star.pstar()
print(star.hi)

#python call_star.py
'''
#模塊的特性:導入模塊時模塊中的code會先執行一遍!
#模塊中的代碼,希望它在作爲一個腳本文件直接運行時執行;希望他被當成模塊導入時,不要執行,這個時候可以使用_name_屬性
'''
_name_是一個特殊的變量,它的值有兩個
一個是_main_,另一個是 模塊名
#cat foo.py

print(__name__)

#cat bar.py

import foo

#python foo.py //自定義的模塊foo

__main__

#python bar.py //調用foo模塊的文件

foo
'''
#通過_name_特殊變量可解決上述問題
'''
#vim star.py 
hi = 'hello world'

def pstar(n=30):
    print('*' * n)
    
if __name__ == '__main__': //在自定義star模塊中使用_name_特殊變量做一個判斷即可
    print(hi)              //因爲此功能太常用 直接打main + 回車 就能瞬間打印出來
    print(40)
'''
# #生成隨機八位密碼
# from random import choice
#
# all_chs = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
# result = ''
#
# for i in range(8):
#     ch = choice(all_chs)
#     result += ch
#
# print(result)
#函數隨機生成密碼並且可自定義
import sys    #導入後以第一次爲準,如果修改模塊參數需要退出python3然後在進去如重新導入一次即可.
from random import choice
from string import ascii_letters,digits

def randpass(site=8):

    all_chs = ascii_letters + digits
    result = ''

    for i in range(site):
        ch = choice(all_chs)
        result += ch
    return result

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('默認隨機8位:',randpass())
        exit(1)
    else:
        print('生成%s位密碼:'% sys.argv[1],randpass(int(sys.argv[1])))



# #午間練習:時長兩小時
# range(10) #[0,1,2,3,4,5,6,7,8,9]
# print(list(range(10)))
# range(6,11) #[6,7,8,9,10]
# range(1,10,2) #[1,3,5,7,9]
# range(10,0,-1) #[10,9,8,7,6,5,4,3,2,1]
# sum100 = 0
#
# for i in range(1,101):
#     sum100 += i
#
# print(sum100)
#
#
# fib = [0,1]
#
# for i in range(8):
#     fib.append(fib[-1]+fib[-2])
#
# print(fib)
#
#
# for i in range(1,10):
#     for j in range(1,i+1):
#         print('%s*%s=%s'% (j,i,i*j),end='')
#     print()
#
# #i=1 -> j:[1]
# #i=2 -> j:[1,2]
# #i=3 -> j:[1,2,3]
#
#
# n = int(input('number: '))
#
# for i in range(1,n + 1):
#     for j in range(1,i + 1):
#         print('%s*%s=%s'% (j,i,j*i),end='')
#     print()
#
# #10+5的結果放到列中
# print([10+5])
# #10+5這個表達式計算10次
# print([10 + 5 for i in range(10)])
# #10+i的i來自於循環
# print([10 + i for i in range(10) ])
# print([10+i for i in range(1,11)])
# #通過if過濾,滿足if條件的才參與10+i的運算
# print([10+i for i in  range(1,11)if i % 2 == 1])
# print([10 + i for i in range(1,11)if i % 2])
# #生成ip地址列表
# ['192.168.1.%s'% i fori i in range(1,255)]
#
# #石頭剪刀布三局兩勝
# import  random
#
# all_choice = ['石頭','剪刀','布']
# win_list = [['石頭','剪刀'],['剪刀','布'],['布','石頭']]
# prompt = '''(0)石頭
# (1)剪刀
# (2)布
# 請選擇(0/1/2): '''
# cwin = 0
# pwin = 0
#
# while cwin < 2 and pwin <2:
#     computer = random.choice(all_choice)
#     ind = int(input(prompt))
#     player = all_choice[ind]
#
#     print("Your choice: %s,Computer's choice: %s"% (player,computer))
#     if player == computer:
#         print('\033[31;1m平局\033[0m')
#     elif [player,computer] in win_list:
#         pwin  += 1
#         print('\033[31;1mYou WIN!!!\033[0m')
#     else:
#         cwin += 1
#         print('\033[31;1mYou LOSE!!!\033[0m')
# #文件操作的三個步驟:打開 讀寫 關閉
# #cp /etc/passwd /tmp
# f = open('/tmp/passwd') #默認以r的方式打開純文本文件
# data = f.read() #read()把所有內容讀取出來
# print(data)
# data = f.read() #隨着讀寫的進行,文件指針向後移動.
# #因爲第一個f.read()已經把文件指着移動到了結尾了,所以在讀就沒有數據了
# #所以data是空字符串
# f.close()
#
# f = open('/tmp/passwd')
# data = f.read(4) #讀4字節
# f.readline() #督導換行符\n結束
# f.readlines() #把每一行數據讀出來放到列表中
# f.close()
#
# ###########################
# f = open('/tmp/passwd')
# for line in f:
#     print(line,end='')
# f.close()
#
#
# ##############################
# f = open('圖片地址','rb') #打開費文本文件要加參數b
# f.read(4096)
# f.close()
#
# ##################################
# f = open('/tmp/myfile','w') #'w'打開文件,如果文件不存在則創建
# f.write('hello world!\n')
# f.flush() #立即將緩存中的數據同步到磁盤
# f.writelines(['2nd line.\n','new line.\n'])
# f.close() #關閉文件的時候,數據保存到磁盤
#
# ############################
# with open('/tmp/passwd')
# f.tell() #查看文件指針的位置
# f.readline()
# f.tell()
# f.seek(0,0) #第一個數字是偏移量,第二位數字是數字相對位置.
#             #相對位置0表示開頭,1表示當前,2表示結尾
# f.tell()
# f.close()
#
# f1 = open('/bin/ls','rb')
# f2 = open('root/ls','wb')
#
# data = f1.read()
# f2.write()
#
# f1.close()
# f2.close()
#
#
#
# src_fname = '/bin/ls'
# dst_fname = '/root/ls'
#
# src_fobj = open(src_fname,'rb')
# dst_fobj = open(dst_fname,'wb')
#
# while True:
#     data = src_fobj.read(4096)
#     if not data:
#         break
#     dst_fobj.write(data)
#
# src_fobj.close()
# dst_fobj.close()
#
# import sys
#
# print(sys.argv ) #sys,argv是sys是模塊裏的argv列表
#
# #python3 position_args.py
# #python3 position_args.py 10
# #python3 position args.py 10 bob


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