Python 入門習題

如果下面代碼有問題或者你有更好的實現方法歡迎與我私信~

1、輸入一個字符串,內容是帶小數的實數,例如"123.45",輸出是兩個整數變量x和y,x是整數部分123,y是小數部分45。你可以用split函數完成。

str =input()
L=str.split(".")   #此函數可以將輸入的小數部分的.符號最後消除,並用,號代替分割整數和小數
L=[int(e) for e in L]   #分割後依舊是字符串形式,需要將字符串轉化爲數值
print(L[0])
print(L[1])

2、寫Python程序find(s,x)來完成s.find()函數的基本功能。計算x字符串在s字符串中出現的開始位置。x沒有在s出現的話,傳回-1。

def find(s,x):
     L=list(s)#將字符串轉化爲列表
     i=0
     for a in L:#遍歷在列表L中的元素
      if(a==x):  #尋找有沒有在列表元素中出現的元素x
       return i  #如果存在,就返回位置i,這裏的位置i是從0計數
      i=i+1 #如果不存在相當於else,繼續循環下去
     return -1  #for循環結束後,如果不滿足條件,最後返回-1
print(find("hello",'e'))

運行結果

1

一定注意,同一層次的語句必須要有相同的縮進,一點都不能不同!!
3、在find()的基礎上,寫Python程序來完成replace(s,old,new)函數的功能,將所有在s中出現的old字符串轉換成new字符串。

4、在find()的基礎上,寫Python程序來完成count(s,x)函數的基本功能,計算所有在s中出現的x字符串的個數。注意:計算出現的個數每一個字符不能重複計算。例如:s=“222222”,count(s,“222”)是2,不是4。

def count(s,x):  #定義函數
    if s.find(x) == -1: #尋找s字符串中是否存在x,若果沒有沒有存在,函數返回-1的值
        return 0 #不存在x的字符串,則count函數返回0,即x出現次數爲0
    L = s.split(x) #如果存在,則用split函數將分割x,然後以字符串形式用逗號隔開以列表形式存在
    #這裏L=["222","222"]
    return len(L)-1   #
i = count("222222","222")
print(i)

顯示IndentationError:unindent dose not match any outer indentation level
出現這種問題,一般都是因爲沒有縮進導致的問題。使用文本編輯器notepad++顯示代碼或者打開腳本文件,在菜單欄中選擇視圖->顯示符號->顯示空格與製表符。可以查看問題所在,是不是製表符tab與空格space混用導致運行出現的問題

5、給出一個python程序片段,用for循環,用print語句輸出1到100的奇數

for i in range(101):
 if i%2!=0:
  print(i)

或者

n=0
while n<100:
  n=n+1
  if n%2==0:
    continue #continue語句會直接繼續下一輪循環,後面的print()語句不會執行
  print(n)

6、編寫Python程序,求出10到100之間不能被3整除,又不能被7整除的所有整數

n=9
while n>=9 and n<100:
   n=n+1
   if n%3==0 or n%7==0:
     continue
   print(n)

7、編寫Python程序,計算一個任意位數的整數的各位數字之和。例如,輸入12345,程序計算顯示1+2+3+4+5的值

num=int(input())
sum=0
while num>0:
   m=num%10
   sum=sum+m
   num=num//10
print(sum)

這段正確代碼之前,編譯出現問題,num=input()當我輸入數字時,報錯:TypeError:’>'not supported between instances of ‘str’ and ‘int’ ,報錯原因:input()輸入的內容是一個字符串,字符串跟整數型值比較,類型不匹配,故要輸入數字時,應該改爲int(input())
注意還有個問題,這裏數字整除的符號用的//這裏與傳統的C語言、Java、C++方法不一樣,它們的整除符號是/,我在Python的運行環境裏面,使用/得出來的結果是小數,比如4.5/2結果是2.25而不是我想象中的2。在Python的環境中/保留了小數,無論操作數是整數還是浮點數,結果總是浮點數所以在Python3.0環境中,整除的符號用//

8、設sum=0!+1!+…+n!,編寫Python程序,求當n爲何值時,sum的十進制表示超過20位

def jie(n): #計算階乘和函數
    x=1
    sum=1
    for i in range(1,n+1): #注意這裏的範圍是從1到n,左閉右開
      x=x*i
      sum=sum+x #sum初始值是1,因爲0的階乘是1,若在range裏面一開始左範圍是0會導致0的階乘計算結果是0,錯誤
    return sum
def wei(sum):#計算位數個數的函數
    cnt=0
    while sum>0:
      sum=sum//10 #整除運算,得到整數結果
      cnt=cnt+1
    return cnt
n=0
sum=0
while n>=0:
   sum=jie(n)
   count=wei(sum)
   if(count>=20):
      print(n)
      break
   n=n+1

21

9、編寫Python程序,根據用戶的輸入的整數n,列出斐波拉契數列的前n項,並求出前n項的和。其中,斐波拉契數列的前n項通項爲Fn=Fn+1+Fn+2(n>=2),其中F0=0,F1=1;
要求:程序能夠判定n的合法性(n應該是一個正整數),否則,提示用戶重新輸入
提示:儘量避免使用遞歸實現,若無法避免,建議測試時選擇n<30
在這裏插入圖片描述
這裏補充斐波拉契數列的兩種寫法
循環寫法

#循環寫法
a,b=0,1
list1=[0,1]#這裏是第一項和第二項
n=int(input())#輸入需要添加的項數
for i in range(n):
    a,b=b,a+b
    list1.append(b)#在列表後面添加n個元素,則新列表有n+2個元素在內
print(list1)

def Fib(n):
  f,f1,f2=0,0,1
  for i in range(0,n-1):
     f=f1+f2
     f1=f2
     f2=f
  return f2
num=int(input())
print(Fib(num))

遞歸寫法

#遞歸寫法,從第0項開始
def Fib(n):
  if n==0:
     return 0
  if n==1:
     return 1
  if n>1:
     return Fib(n-1)+Fib(n-2)
num=int(input())
print(Fib(num))

循環寫法與遞歸寫法比較,遞歸寫法時間複雜度是2^n,循環寫法時間複雜度n-1,循環寫法的效率更高
程序源代碼

f0,f1=0,1
sum=0
list1=[0,1]#這裏是第一項和第二項
n=int(input())#輸入需要添加的項數
for i in range(n-2):
    f0,f1=f1,f0+f1
    list1.append(f1)#在列表後面添加n-2個元素,則新列表有n個元素在內
print(list1)
for i in list1:
   sum=sum+i
print("Sum of Fib=",sum)

10、猜數字遊戲。預設一個0~9之間的整數,讓用戶猜一猜並輸入所猜的數字,如果大於預設的數,顯示“太大”;小於預設的數字,顯示“太小”,如此循環,直至猜中該數,顯示“恭喜!你猜中了!”

num=7
while True:
   guess=int(input("請輸入你猜的數字(0~9):"))
   if guess==num:
     print("恭喜!你猜中了!")
     break
   elif guess>num:
     print("太大")
   else:
     print("太小")

while True 語句的核心思想:如果出現錯誤的話,可以繼續循環

12、編寫Python程序,實現攝氏溫度與華氏溫度的相互轉換,並根據輸入判斷人體的舒適度。其中。攝氏溫度C與華氏溫度F的轉換公式爲:F=1.8C+32;人體舒適度的判斷標準爲:

Temperature C<18oC 18oC<=C<=25oC C>25cC
Human Feel cold nice hot

要求:①程序既能接受攝氏溫度的攝入,也能接受華氏溫度的輸入,且對大小寫不敏感(如18C,86f);
②程序能夠判斷輸入溫度的合法性(通常介於-30oC至50oC之間),否則,提示用戶重新輸入;
③溫度轉化後的結果保留一位小數(round(x,n)可以返回浮點數x的四捨五入的值,n爲精度)。
測試樣例

輸入 -17C 66f 55c a9C
輸出 Fahrenheit temp is 1.4F Human feels cold Celsius temp is 18.9C Human feels nice Abnormal temperature! please try again Invalid input! Please try again

問題解決分析
先來寫一段溫度轉換代碼

while True:
  temp=input("請輸入溫度:")
    #使用保留字判斷一個元素是否在列表中
  if temp[-1] in ['F','f']:  #temp[-1]字符串索引,獲取temp字符串倒數第一個字符,即判斷輸入是華氏還是攝氏
      C=(eval(temp[0:-1])-32)/1.8  #temp[0:-1]字符串切片,獲取temp字符串從0但不到倒數第一個字符的字符串,相當於把字符串最後一個字符串去掉
      print("華氏溫度轉換攝氏溫度後的溫度是{:.2f}C".format(C))
      break
  elif temp[-1] in ['C','c']:
      F=1.8*eval(temp[0:-1])+32
      print("攝氏溫度轉換華氏溫度後的溫度是{:.2f}F".format(F))
      break
  else :
      print("輸入有問題!")

這裏print("華氏溫度轉換攝氏溫度後的溫度是{:.2f}C".format(C)){ }表示槽,後續變量填充到槽中,{:.2f}表示將變量C填充到這個位置時取小數點後2位(注意這裏不是四捨五入,是捨棄後面的小數)
評估函數eval() 去掉參數最外側引號並執行餘下語句的函數

這幾段代碼有點運行問題

>>>eval("1")
1
>>>eval("1+2")
2
>>>eval('"1+2"')
1+2
>>>eval('print("hello")')
hello

對於輸入字符串處理,要求輸入合法數據,由數字+字母組成,這裏討論在關鍵字母前數字輸入問題。函數str.isdigit()無參數,判斷字符串str是否是數字,但在運行過程中,發現輸入正整數的結果是True,但是若輸入負數、小數就不行。使用函數isinstance(a,int),用法是判斷一個量是否是相應的類型,比如

a=1
print(isinstance(a,int))
print(isinstance(a,float))
返回 True False

def func(z):
   try:
     z=float(z) #強制將傳入的參數(數字字符串)轉換成float類型
     return isinstance(z,float)
   except ValueError:
     return False
temp=input("請輸入溫度:")
p=func(temp[0:-1])
print(p)

程序源代碼,這裏我採用的是循環輸入數據進行測試,但是還有個細節問題,我是想實現錯誤的時候繼續重新輸入,但輸入正確時有了結果不會繼續接下來的輸入了,這裏還未解決,有時間好好想想。

def func(z):
   try:
     z=float(z) #強制將傳入的參數(數字字符串)轉換成float類型
     return isinstance(z,float)
   except ValueError:
     return False
while True:
  temp=input("請輸入溫度:")
  p=func(temp[0:-1])
    #使用保留字判斷一個元素是否在列表中
  if temp[-1] in ['F','f'] and p:  #temp[-1]字符串索引,獲取temp字符串倒數第一個字符,即判斷輸入是華氏還是攝氏
      C=(eval(temp[0:-1])-32)/1.8  #temp[0:-1]字符串切片,獲取temp字符串從0但不到倒數第一個字符的字符串,相當於把字符串最後一個字符串去掉
      print("華氏轉攝氏後的溫度是{:.1f}C".format(C))
      if C<18:
        print("Human feels cold")
      elif C>=18 and C<=25:
        print("Human feels nice")
      else:
        print("Human feels hot")
  elif temp[-1] in ['C','c'] and p:
      while True:
         if eval(temp[0:-1])>=-30 and eval(temp[0:-1])<=50:
            F=1.8*eval(temp[0:-1])+32
            print("攝氏轉華氏後的溫度是{:.1f}F".format(F))
            if eval(temp[0:-1])<18:
               print("Human feels cold")
            elif eval(temp[0:-1])>=18 and eval(temp[0:-1])<=25:
               print("Human feels nice")
            else:
               print("Human feels hot")
            break
         else :
            print("Abnormal temperature! Please try again.")
            break
  else:
      print("Invalid input! Please try again.")

2019年9月1日更新算法

def func(z):
   try:
     z=float(z) #強制將傳入的參數(數字字符串)轉換成float類型
     return isinstance(z,float)
   except ValueError:
     return False
while True:
  temp=input("請輸入溫度:")
  p=func(temp[0:-1])#判斷最後字符前的字符串是否爲數據類型
    #使用保留字判斷一個元素是否在列表中
  if temp[-1] in ['F','f'] and p:  #temp[-1]字符串索引,獲取temp字符串倒數第一個字符,即判斷輸入是華氏還是攝氏
      C=(eval(temp[0:-1])-32)/1.8  #temp[0:-1]字符串切片,獲取temp字符串從0但不到倒數第一個字符的字符串,相當於把字符串最後一個字符串去掉
      print("華氏轉攝氏後的溫度是{:.1f}C".format(C))
      if C<18:
        print("Human feels cold")
        break
      elif C>=18 and C<=25:
        print("Human feels nice")
        break
      else:
        print("Human feels hot")
        break
  elif temp[-1] in ['C','c'] and p:
      while True:
         if eval(temp[0:-1])>=-30 and eval(temp[0:-1])<=50:
            F=1.8*eval(temp[0:-1])+32
            print("攝氏轉華氏後的溫度是{:.1f}F".format(F))
            if eval(temp[0:-1])<18:
               print("Human feels cold")
            elif eval(temp[0:-1])>=18 and eval(temp[0:-1])<=25:
               print("Human feels nice")
            else:
               print("Human feels hot")
            break
         else :
            print("Abnormal temperature! Please try again.")
            break
      break
  else:
      print("Invalid input! Please try again.")

這次能實現輸入數據合法時得到程序運行結果能夠按任意鍵退出。當輸入數據不合法時,能夠提示數據不合法的原因並同時讓用戶重新輸入,直到用戶輸入合法的數據時才能任意鍵退出。

11、編寫Python程序,實現八進制到二進制的轉換,其中,程序只能接受正整數和負整數(小數、非八進制數、0均爲非法輸入),輸出的二進制數的最高位爲符號位(正數爲0,負數爲1)

進制 描述
二進制 進位規則: 逢二進一 ;借位規則:借一當二;只能用0和1來表示
八進制 採用0,1,2,3,4,5,6,7八個數字,逢8進1
十六進制 逢16進1,一般用數字0到9和字母A到F表示,其中A~ F表示10~15

問題分析:程序只能接受正整數和負整數,這裏有一個判斷,判斷控制檯輸入是否爲整數(正整數、負整數),小數、非八進制數、0爲非法輸入,如果控制檯輸入非法數據,提示重新輸入。
①二進制轉八進制
從小數點開始,整數部分向左,小數部分向右,每3位爲一組用一位八進制數的數字表示,不足3位的要用‘0’補足3位,就得到一個八進制數。
②八進制轉二進制
把每一個八進制數轉換成3位的二進制數,得到一個二進制數
八進制與二進制數字對應關係如下

000->0
001->1
010->2
011->3
100->4
101->5
110->6
111->7

③如果按照以上兩點的思路一個一個來轉換我覺得不太現實(最主要是偷懶哈哈哈),不知道庫函數有沒有相應的轉換函數,或者間接轉換也行。好像也只能間接轉換了。

num='101'
num=int(num,2)
print(num)

以上結果是二進制轉十進制,int()函數,是將其他進制的數字轉換成十進制的數字,其中int()函數傳入的第一個參數是需要轉換的其他進制的字符串形式的數字(在這段代碼正確以前,我寫過num=101,101兩邊加分號表示它是一個字符串,而此時系統報錯:int() cant’t convert non-string with explict base。)第二個參數是第一個參數的進制數,也就是說第一個參數傳的是多少進制的數字第二個參數就傳多少個(例如這裏傳入的是二進制的數字字符串,這裏參數爲2),數據類型類型爲數字類型。
有了這個函數,可以考慮是否可以先將題中的八進制數轉成十進制數,再將其十進制數轉換成二進制數
bin()函數:將十進制的數字轉換成二進制的數字。傳入的是十進制的數字,數據類型爲數字類型。
oct()函數: 是將十進制的數字轉換成八進制的數字。傳入的是十進制的數字,數據類型爲數字類型。
hex()函數:將十進制的數字轉換成十六進制的數字。傳入的是十進制的數字,數據類型爲數字類型。
八進制轉二進制的代碼如下

num1=input("請輸入一個八進制的數字:")
num2=int(num1,8)#把輸入的字符串形式的八進制數字num1轉換成十進制數字
print("八進制數轉換成二進制之後的數字是:",bin(num2))

以上代碼出了點問題,運算出來的結果含有b,在計算機網頁在現轉換說是非法數據。。。
如果從間接轉換的思路不直接用函數,二是自己寫函數的方法:
二進制轉十進制

整數:1101101012=1×28+1×27+0×26+1×25+1×24+0×23+1×22+0×21+1×20
=256+128+32+16+4+1=43710
帶有小數:1010.11012= 1×23 + 0×22+ 1×21+ 0×20 + 1×2-1 + 1×2-2 + 0×2-3 + 1×2-4
= 10.812510

#二進制轉十進制
b=input("請輸入二進制數字:")
sum=0
for i in range(0,len(b)):
    if b[i]=='1':
      num=2**(len(b)-i-1)#這裏2**n是實現計算2的n次方
      #這裏指數運算在循環進行了很多次
      sum=sum+num
print(sum)

以上算法中,計算機執行指數運算往往比單純的加減乘除法運算複雜地多,更加費時,需要改進。

#改進後的二進制轉十進制代碼
#這裏指數運算只需要進行一次
b=input("請輸入二進制數字:")
num=2**(len(b)-1)
sum=0
for i in range(0,len(b)):
    if b[i]=='1':
      sum=sum+num
    num=num//2#整除,得到整數
print(sum)

十進制轉二進制

num=int(input("請輸入十進制數字:"))
l=[];#建立列表
while(num!=0):
    s=num%2  #取餘1或0
    num=num//2  #取整
    l=[s]+l #把[s]作爲一個列表元素加入列表l的頭部
for i in range(0,len(l)):
    print(l[i],end='')

八進制轉十進制

整數:536278=5×84+3×83+6×82+2×81+7×80
=2242310
帶有小數:423.51768=4×82+2×81+3×80+5×8-1+1×8-2+7×8-3+6×8-4
=275.6557617187510

b=input("請輸入8進制數字:")
sum=0
for i in range(0,len(b)):
      num=int(b[i])*(8**(len(b)-i-1))#這裏8**n是實現計算8的n次方
      #這裏指數運算在循環進行了很多次
      sum=sum+num
print(sum)

與二進制轉十進制一樣,存在指數運算導致程序運行費時所以修改新的代碼

#改進後的八進制轉十進制代碼
#這裏指數運算只需要進行一次
b=input("請輸入八進制數字:")
num=8**(len(b)-1)
sum=0
for i in range(0,len(b)):
    sum=sum+num*int(b[i])
    num=num//8#整除,得到整數
print(sum)

八進制轉二進制的源代碼

#八進制轉二進制
#先把八進制轉爲十進制,再將十進制轉化爲二進制
def bzs(b):
  #定義八進制轉十進制的函數,傳入參數是數字字符串
   sum=0
   for i in range(0,len(b)):
      num=int(b[i])*(8**(len(b)-i-1))#這裏8**n是實現計算8的n次方
      #這裏指數運算在循環進行了很多次
      sum=sum+num
   return sum
def sze(num):
  #定義十進制轉二進制的函數,傳入參數是數字,不是數字字符串
   l=[];#建立列表
   while(num!=0):
      s=num%2  #取餘1或0
      num=num//2  #取整
      l=[s]+l #把[s]作爲一個列表元素加入列表l的頭部
   for i in range(0,len(l)):
      print(l[i],end='')
num1=(input("請輸入八進制數字:"))
num2=bzs(num1)#這裏num2等於八進制轉換成十進制後的數字,數據類型爲數字類型而非字符串類型
sze(num2)#調用十進制轉二進制函數,輸出最後二進制結果

13、使用Python語言編寫遞歸函數,實現十進制數到R進制的轉換,且2<=R<10

進制 數字表示
二進制 0、1
八進制 0,1,2,3,4,5,6,7
十六進制 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
def jz(n,x):#n爲待轉換的十進制數字,x爲進制,取值範圍在2-10
   a=[0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'] #進製表示的所有數字類型
   b=[] #創建一個列表
   while True:
     s=n//x #整除取商
     y=n%x #取餘
     b=b+[y] #將餘數存入列表表尾
     if s==0:
         break  #一直整除,直到最後商爲0時才結束
     n=s #每次整除取商取餘後,將商的值賦給s,繼續下一次整除取商取餘
   b.reverse() #反轉列表b中的所有元素
   for i in b: #遍歷列表b中的所有元素(這裏是餘數的逆序排列)
         print(a[i],end='') #下標對應的相應的進制轉換數字
number=input()#輸入字符串
L=number.split(',')#將字符串分割,形成列表
jz(int(L[0]),int(L[1]))#將列表中的元素強制轉換成int型,傳入函數中

輸入5,2的字符串,分割字符串形成列表[‘5’,‘2’]

101

14、完成merge(L1,L2)函數:輸入參數是兩個從小到大排好序的整數列表L1和L2,返回合成後的從小到大排好序的大列表X,如merge([1,4,5],[2,7])會返回[1,2,4,5,7],merge([],[2,3,4])會返回[2,3,4]

def merge(L1,L2):
    L=[]
    L.extend(L1)
    L.extend(L2)
    L.sort()
    return L
print(merge([1,4,5],[2,7]))
print(merge([],[4,3,2]))

法2

def merge(L1,L2):
    L=[]
    L.extend(L1)
    L.extend(L2)
    L.sort()
    return L
L1=[]
L2=[]
str1=input("請輸入L1:")
L1=str1.split(',')
L1=list(map(int,L1)) #將數字字符轉化爲數字
str2=input("請輸入L2:")
L2=str2.split(',')
L2=list(map(int,L2))
print(merge(L1,L2))

補充:將列表的字符串轉爲數字
目的:L1=[‘1’,‘2’,‘3’,‘4’,‘5’]轉化成L1=[1,2,3,4,5]

法①基礎循環

L2=[]
for i in L1:
   L2.append(int(i))
L1=L2
print(L1) #[1,2,3,4]

法②簡單循環

L1=['1','2','3','4']
L1=[int(i) for i in L1]
print(L1) #[1,2,3,4]

法③Python 3.x 使用map函數,返回map對象,轉換爲list

L1=['1','2','3','4']
L1=list(map(int,L1))
print(L1) #[1,2,3,4]

15、從鍵盤接收十行輸入(使用input),然後將輸入保存到文件中。(提示:由於input()不會保留用戶輸入的換行符,調用write()方法時必須加上換行符。

file = open("test.txt","a+")
s = ""
for i in range(0,10):
    s = input()
    s+="\n"
    file.write(s)
file.close()

16、假設一篇英文文章存儲在文件paper.txt中,請統計每個單詞在文章中出現的次數並且對其進行排序。
注意字符串包含‘\u200b’的Unicode編碼,單獨打印出來是一個空格,且佔一個長度,刪除時用replace方法
思路:對於英文原文的文章,一般都是空格分開單詞,或者逗號和點號隔開句子,要想辦法處理這些特殊符號使其不成爲干擾判斷單詞的障礙,就要把這些特殊符號替換掉,這裏使用replace函數。將單詞分割存儲在列表中,使用split方法;要統計單詞個數,遍歷判斷,這裏需要用到字典,值與關鍵值之間的對應可以表示出其出現的次數。
原文

we are meant for each other,monkey and lion,
we will stand on the mountain together.

f=open('test.txt',"r",encoding='utf8')
readlines=f.read()
f.close()
list=[]
word=[]
words=''
wo=''
for line in readlines:
    words=line.replace(',',' ')
    words=words.replace('.','')
    words=words.replace('\u200b','')
    wo+=words
list=wo.split()
dir={}
#雙重for循環遍歷列表,尋找相等的單詞
for i in range(len(list)):
    dir[list[i]]=0 #字典初始值爲0
    for j in range(len(list)):
        if list[i]==list[j]:
            dir[list[i]]+=1
print(dir)

注意在open打開文件txt之後,執行程序完畢前一定要使用close將其關閉,即f.close()。原因:寫文件操作時,操作系統往往不會立刻把數據寫入磁盤,而是放到內存緩存起來,空閒時再慢慢寫入。當調用close方法時,操作系統才保證把沒有寫入的數據全部寫入磁盤,若沒有調用close方法,後果可能是隻寫了一部分數據到磁盤,剩下未寫入的將會丟失,也可能寫入的數據全部在緩存區丟失。
也可以不用close方法,使用with open() as語句關閉文件
功能:當文件讀寫完成後,會自動幫我們調用close方法
建議:多用with open語句,少用open語句

#使用open語句
f=open('test.txt','r',encoding='utf8')
f.close()
#使用with open()語句
with open('test.txt','r',encoding='utf8') as f:
   print(f.read())

這裏補充python read、readline、readlines以及讀取大文件的方法
read()方法:以原格式返回全部文本
readline()方法:只返回第一行文本
readlines()方法:列表的格式返回全部文本

二進制文件:上面讀取的文本都是文本文件,並且是utf-8編碼的文本文件。若要讀取二進制文件,如圖片、視頻等,使用‘rb’模式打開文件

模式 描述
r 只讀,文件指針放於文件開頭,默認模式
r+ 讀寫,文件指針放於文件開頭
rb 二進制格式只讀,文件指針放於文件開頭,默認模式
rb+ 二進制格式讀寫,文件指針放於文件開頭
w 只寫,若該文件已存在則覆蓋,若不存在則創建新文件
w+ 讀寫,若該文件已存在則覆蓋,若不存在則創建新文件
wb 二進制格式只寫,若該文件已存在則覆蓋,若不存在則創建新文件
wb+ 二進制格式讀寫,若該文件已存在則覆蓋,若不存在則創建新文件
a 追加,若文件存在則指針放於文件結尾,即新的內容寫入到已有的內容以後,若該文件不存在則創建新的文件進行寫入
a+ 讀寫的追加,若文件存在則指針放於文件結尾,若不存在則創建新的文件讀寫
ab 二進制格式追加讀寫,若文件存在則指針放於文件結尾,即新的內容寫入到已有的內容以後,若該文件不存在則創建新的文件進行寫入
ab+ 二進制追加,文件指針放於文件結尾,若該不存在,創建新文件用於讀寫

15、編寫Python程序,實現下述兩個功能:
a.程序能將九九乘法表按下圖格式寫入文件try.txt;
b.程序能將文件try.txt中的內容讀出,並將奇數行和偶數行分別存入文件o.txt和文件e.txt。提示:製表符爲\t,換行符爲\n,乘號可以使用x代替
在這裏插入圖片描述
①打印九九乘法表

#打印九九乘法表
for i in range(1,10):
  #控制行數,從1-9行,共9行
    for j in range(1,i+1):
      #控制列數,從1列開始遞增,直到9列
      print("%d×%d=%d"%(j,i,j*i),end=' ')#end=' '表示不換行
    print(' ')

或者

for i in range(1,10):  #控制行數
    for j in range(1,i+1):  #控制每行打印幾個表達式
        print (str(j)+"x"+str(i)+"="+str(i*j)+'\t',end='')
    print ('\n')#結束換行

在編譯第二個代碼時候,我的print代碼是這樣的print(j+"x"+i+"="+i*j+'\t',end=''),這時候程序報錯:unsupported operand type(s) for +:‘int’ and ‘str’。因爲在這裏是字符串類型進行連接(有+號,還有×號、=號),而j、i是int型數據,直接用+號將它們連接起來會報錯
解決辦法

int轉成string,函數str(number)
string轉成int,函數int(string)

接下來,把九九乘法表寫入文件中的代碼,實現要求a

file =open("houzi.txt","a+")#打開houzi文件用於追加,文件指針會放在文件結尾
s=""#初始化字符串,使其爲空
for i in range(1,10):  #控制行數
   for j in range(1,i+1): #控制列數
      s=str(j)+"x"+str(i)+"="+str(i*j)+'\t'
      file.write(s)# 傳遞參數字符串s寫入到已打開的文件中
   file.write('\n')#每一行輸入完後,在其後面加換行符
file.close()#關閉文件

接下來實現將houzi.txt中的九九乘法表按奇數行和偶數行分別存入paper1.txt和paper2.txt中
以下是該題程序完整代碼

file =open("houzi.txt","a+")#打開houzi文件用於追加,文件指針會放在文件結尾
s=""#初始化字符串,使其爲空
for i in range(1,10):  #控制行數
   for j in range(1,i+1): #控制列數
      s=str(j)+"x"+str(i)+"="+str(i*j)+'\t'
      file.write(s)# 傳遞參數字符串s寫入到已打開的文件中
   file.write('\n')
file.close()#關閉文件
file =open("houzi.txt","r+")#打開houzi文件用於追加,文件指針會放在文件結尾
file1=open("paper1.txt","w+")
file2=open("paper2.txt","w+")
for i in range(1,10):
     s=file.readline()
     if i%2==0:  #如果是偶數 
        file1.write(s)
     else:
        file2.write(s)
file.close()#關閉文件
file1.close()
file2.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章