『Pythonコアプログラミング』第5章


5-1.型を整える.Pythonの普通の整型と長い整型の違いを話しますか?
答え:
ほとんどの32ビットマシンでは、標準整数の値範囲は-2^31~2^31-1であり、64ビットマシンで64ビットコンパイラでコンパイルされたPythonを使用すると、整数は64ビットである.一方、ロング整数が表す数値は、マシンがサポートする仮想メモリサイズにのみ関係し、ロング整数は標準整数のスーパーセットです.
5-2.オペレータ.
(a)関数を書き、2つの数の積を計算して返します.
(b)コードを書いてこの関数を呼び出し、その結果を表示する.
答え:
(a)
def two(a,b):
    return a*b

(b)
def two(a,b):
    return eval(a)*eval(b)
a=raw_input('Enter a number:')
b=raw_input('Enter another number:')
print 'The answer is',two(a,b)

5-3.標準タイプオペレータ.スクリプトを書き、テストの成績を入力し、以下の基準に基づいて採点成績(A-F)を出力します.
A:90~100
B:80~89
C:70~79
D:60~69
F:<60
答え:
def grade(g):
    if 90<=g<=100:
        return 'A'
    elif 80<=g<90:
        return 'B'
    elif 70<=g<80:
        return 'C'
    elif 60<=g<70:
        return 'D'
    else:
        return 'F'
g=int(raw_input('Enter your grade:'))
print 'Your ceping is',grade(g)

5-4.余剰を取る.与えられた年が閏年かどうかを判断するには、次の式を使用します.
1つの閏年とは、4で除去できるが、100で除去できないか、400で除去できることを意味する.例えば1992年、p 1996年、2000年は閏年ですが、1967年、1990年は閏年ではありません.次が閏年の全世紀は2400年です.
答え:(問題は間違っているはずです)
year=int(raw_input('Enter the year number that your want to test:'))
if (year%4==0 and year%100!=0) or (year%400==0):
    print 'This year is leap year.'
else:
    print 'This year is not leap year'

5-5余剰を取る.1ドル未満の金額を取り、最低何枚のコインに両替できるかを計算します.コインは1セント、5セント、10セント、25セントの4種類があります.1ドルは100セントです.例えば、0.76ドルの換算結果は3枚25セント、1枚1セントであるべきだ.76枚1セント、2枚25セント+2枚10セント+1枚5セント+1枚1セントのような結果は要求に合わない.
答え:
money=float(raw_input('Please input your money less than 1 dollar:'))
mon=money*100
while mon:
    a25=divmod(mon,25)
    a10=divmod(a25[1],10)
    a5=divmod(a10[1],5)
    a1=divmod(a5[1],1)
    total=a25[0]+a10[0]+a5[0]+a1[0]
    print "There are %d coins"% total
    print '''They are consists of %d 25 cent coin ,%d 10 cent coin,
           %d 5 cent coin and %d 1 cent coin.'''% (a25[0],a10[0],a5[0],a1[0])
    money=float(raw_input('Please input your money less than 1 dollar:'))
    mon=money*100

5-6.算数.計算機のプログラムを書きます.あなたのコードはこのような式を受け入れることができて、2つの操作数は1つのオペレータをプラスします:N 1オペレータN 2.ここで、N 1およびN 2は整数型または浮動小数点型であり、オペレータは+、-、*、/、%、**であり、加算、減算、乗算、整形除算、べき乗演算をそれぞれ表すことができる.この式の結果を計算して表示します.ヒント:文字列メソッドsplit()は使用できますが、組み込み関数eval()は使用できません.
答え:
import string
mystr=raw_input("         ,             :")
while mystr:
    lstr=mystr.split(' ')
    a=float(lstr[0])
    b=float(lstr[2])
    if lstr[1]=='+':
        result=a+b
    elif lstr[1]=='-':
        result=a-b
    elif lstr[1]=='*':
        result=a*b
    elif lstr[1]=='/':
        result=a/b
    elif lstr[1]=='%':
        result=a%b
    elif lstr[1]=='**':
        result=a**b
    else:
        print "Error,please input agian."
    print result
    mystr=raw_input("         ,             :")

5-7.略.
5-8.幾何学.面積と体積を計算します.
(a)正方形と立方体.
(b)円とボール.
答え:
num=raw_input('           :1,    2,    3,  4, =》')
bian=float(raw_input('        :'))
def squre(bian):
    print '       %f'%(bian*bian)
def cube(bian):
    print '       %f,   %f'%(bian*bian*6,bian*bian*bian)
def circle(bian):
    print '      %f'%(3.14*bian*bian)
def ball(bian):
    print '      %f,      %f'%(4*3.14*bian*bian*bian/3,4*3.14*bian*bian)
if num=='1':
    squre(bian)
elif num=='2':
    cube(bian)
elif num=='3':
    circle(bian)
elif num=='4':
    ball(bian)
else:
    print 'Error ,try input again.'

5-9.数値形式.数値フォーマットに関する質問に答えます.
(a)なぜ次の例では17+32が49に等しく、017+32が47017+032が41に等しいのか.
>>>17 + 32
49
>>>017 + 32
47
>>>017 + 032
41
(b)なぜ次の式で私たちが得た結果は1342ではなく134 Lなのか.
>>>56l+78l
134L
答え:
(a)0で始まる数字は8進法なので、計算するときは式1を10進法、式2を10進法、8進法で、デフォルトでは8進法を10進法、式3を8進法に変換し、直接加算してから10進法に変換します.
(b)長整数数加算である
5-10.変換します.華氏度から摂氏度への変換を行う関数を1対書きます.変換式はC=(F-32)*(5/9)で、この練習で本当の除算を使うべきです.そうしないと、正しくない結果が得られます.
答え:
from __future__ import division
def convert(cel):
    c=(cel-32)*(5/9)
    print 'The result is',c
fn=float(raw_input('Enter the temperature:'))
convert(fn)

5-11.余剰を取る.
(a)ループと算術演算を用いて0~20の間のすべての偶数を求める.
答え:
for i in range(0,21):
    if i%2==0:
        print i,

(b)同上ですが、今回は奇数をすべて出力します.
答え:
for i in range(0,21):
    if i%2!=0:
        print i,

(c)総合(a)と(b)奇数と偶数を判別する最も簡単な方法は何ですか?
答え:2で割り切れるかどうか見てみましょう.
(d)(c)の結果を用いて,1つの関数を書き,1つの整数が別の整数によって除去されるか否かを検出する.まずお客様に2つの数を入力するように要求して、それからあなたの関数は両者が関係を除いているかどうかを判断して、判断結果によってそれぞれTrueとFalseを返します.
答え:
first=int(raw_input('Please input first number:'))
second=int(raw_input('Please input second number:'))
if (first%second==0) or (second%first==0):
    print 'True'
else:
    print 'False'

5-12.システムの制限.スクリプトを書いて、あなたのPythonが処理できる整数型、長整数型、p浮動小数点型、複数の範囲を確認します.
答え:
import sys
print sys.maxint
print sys.long_info
print sys.float_info

5-13.変換します.時間と分で表される時間を分で表される時間に変換する関数を書きます.
答え:
def sp(ti):
    a=ti.split(':')
    hour=int(a[0])
    mins=int(a[1])
    return hour*60+mins
tt=raw_input('Enter the time you want to transerfer:')
print 'The total time are %d minutes.'%sp(tt)

5-14.略.
5-15.最大公約数と最小公倍数.2つの整数の最大公約数と最小公倍数を計算してください.
答え:
def gys(a,b):
    if a<b:
        a,b=b,a
    while b!=0:
        a,b=b,a%b
    return a
def gbs(a,b):
    return (a*b)/gys(a,b)
fi=int(raw_input('Enter first number:'))
se=int(raw_input('Enter second number:'))
print '      %d,      %d'%(gys(fi,se),gbs(fi,se))

5-16.家庭の財務.初期金額と月のオーバーヘッド数を指定し、サイクルを使用して、残りの金額の当月の支出数を決定し、最後の支出数を含む.Payment()関数では、初期金額と月額額が使用され、出力結果は次の形式に似ています.
Enter opening balance:100.00
Enter monthly payment:16.13
                                       Amount Remaining
pymt#         Paid                  Balance
--------       ---------             -----------------
0                $0.00                   $100.00
1                $16.13                 $83.87
2                $16.13                 $67.74
3                $16.13                 $51.61
4                $16.13                 $35.48
5                $16.13                 $19.35
6                $16.13                 $3.22
7                $3.22                   $0
答え:
Balance=float(raw_input('Enter opening balance:'))
Paid=float(raw_input('Enter monthly payment:'))
sep='--------'
pypt=0
print '%20s'%('Amount Remaining')
print '%s'%('pypt#'),'%10s'%('Paid'),'%18s'%('Balance')
print '%s'%sep,'%10s'%sep,'%18s'%sep
print '%s%12s%20s' % (0, 0.00, 100)
pypt=1
while (Balance-pypt*Paid)>=0:
      pypt+=1
      print '%s%12s%20s'%(pypt-1,Paid,Balance-(pypt-1)*Paid)
print '%s%12s%20s'%(pypt,Balance-(pypt-1)*Paid,0)

5-17.*乱数乱数モジュールを熟読して、次の問題を解きます.N個の要素を有する乱数nからなるリストが生成され、Nとnの値範囲はそれぞれ(1import randombig_n = random.randint(1, 101)
list = range(big_n)
for i in range(big_n):    list[i] = random.randint(-1, 2**31)
print big_nprint listlist.sort()print list