Pythonの基礎練習問題について

21985 ワード

基礎強化練習問題(サンプルコード付)
GitHub-jack・・・(クリックジャンプ)
練習:華氏温度を摂氏温度に変換します.
ヒント:華氏温度から摂氏温度への変換式は、C=(F−32)÷1.8 C=(F−32)div 1.8 C=(F−32)÷1.8である.
参考答案:
f = float(input('       : '))
c = (f - 32) / 1.8
print('%.1f    = %.1f   ' % (f, c))

練習:円の半径を入力して、周長と面積を計算します.
参考答案:
radius = float(input('       : '))
perimeter = 2 * 3.1416 * radius
area = 3.1416 * radius * radius
print('  : %.2f' % perimeter)
print('  : %.2f' % area)

練習:年を入力して閏年かどうかを判断します.
参考答案:

year = int(input('     : '))
#                     \       
is_leap = year % 4 == 0 and year % 100 != 0 or \
          year % 400 == 0
print(is_leap)

練習:英製単位インチと公製単位センチを交換します.
参考答案:
""
value = float(input('     : '))
unit = input('     : ')
if unit == 'in' or unit == '  ':
    print('%f   = %f  ' % (value, value * 2.54))
elif unit == 'cm' or unit == '  ':
    print('%f   = %f  ' % (value, value / 2.54))
else:
    print('        ')

練習:パーセンテージ成績を等級制成績に変換する.
要求:入力した成績が90点以上(90点を含む)であればAを出力し、80点-90点(90点を含まない)でBを出力し、70点-80点(80点を含まない)でCを出力し、60点-70点(70点を含まない)でDを出力し、60点以下でEを出力する.
参考答案:

score = float(input('     : '))
if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'E'
print('      :', grade)

練習:3辺の長さを入力し、三角形を構成できれば周長と面積を計算します.
参考答案:

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))
if a + b > c and a + c > b and b + c > a:
    print('  : %f' % (a + b + c))
    p = (a + b + c) / 2
    area = (p * (p - a) * (p - b) * (p - c)) ** 0.5
    print('  : %f' % (area))
else:
    print('       ')

練習:正の整数を入力して素数を判断します.
ヒント:素数とは、1と自身でのみ除算できる1より大きい整数を指します.
参考答案:
from math import sqrt

num = int(input('        : '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
    if num % x == 0:
        is_prime = False
        break
if is_prime and num != 1:
    print('%d   ' % num)
else:
    print('%d    ' % num)

練習:2つの正の整数を入力し、最大公約数と最小公倍数を計算します.
ヒント:2つの数の最大公約数は2つの数の共通因子の中で最大の数です.2つの数の最小公倍数は、同時に2つの数で除算できる最小の数である.
参考答案:

x = int(input('x = '))
y = int(input('y = '))
#   x  y   x y  
if x > y:
    #         y    x,  x    y
    x, y = y, x
#                 
for factor in range(x, 0, -1):
    if x % factor == 0 and y % factor == 0:
        print('%d %d       %d' % (x, y, factor))
        print('%d %d       %d' % (x, y, x * y // factor))
        break

練習:次のような三角形のパターンを印刷します.
*
**
***
****
*****
    *
   **
  ***
 ****
*****
    *
   ***
  *****
 *******
*********

参考答案:

row = int(input('     : '))
for i in range(row):
    for _ in range(i + 1):
        print('*', end='')
    print()


for i in range(row):
    for j in range(row):
        if j < row - i - 1:
            print(' ', end='')
        else:
            print('*', end='')
    print()

for i in range(row):
    for _ in range(row - i - 1):
        print(' ', end='')
    for _ in range(2 * i + 1):
        print('*', end='')
    print()

水仙の数を探す.
説明:水仙の花の数はまた超完全な数字の不変量、ナルシスト数、べき乗数、アームストロング数と呼ばれて、それは1つの3桁で、この数字の各桁の上の数字の立方の和はちょうどそれ自身に等しくて、例えば:1 3+5 3+3=153 1^3+5^3+3+3^3=53 13+53+53+33=53.
for num in range(100, 1000):
    low = num % 10
    mid = num // 10 % 10
    high = num // 100
    if num == low ** 3 + mid ** 3 + high ** 3:
        print(num)

練習:最大公約数と最小公倍数を求める関数を計算します.
参考答案:
def gcd(x, y):
    """      """
    (x, y) = (y, x) if x > y else (x, y)
    for factor in range(x, 0, -1):
        if x % factor == 0 and y % factor == 0:
            return factor


def lcm(x, y):
    """      """
    return x * y // gcd(x, y)

練習:1つの数が文数であるかどうかを判断する関数を実現します.
参考答案:
def is_palindrome(num):
    """           """
    temp = num
    total = 0
    while temp > 0:
        total = total * 10 + temp % 10
        temp //= 10
    return total == num

練習:1つの数が素数かどうかを判断する関数を実現します.
参考答案:
def is_prime(num):
    """          """
    for factor in range(2, int(num ** 0.5) + 1):
        if num % factor == 0:
            return False
    return True if num != 1 else False

練習:入力した正の整数が回文素数であるかどうかを判断するプログラムを書きます.
参考答案:
if __name__ == '__main__':
    num = int(input('      : '))
    if is_palindrome(num) and is_prime(num):
        print('%d     ' % num)

注意:上記のプログラムから、コードに繰り返される機能と相対的に独立した機能を関数に抽出すると、これらの関数を組み合わせてより複雑な問題を解決することができます.これも、関数を定義し、使用する理由の1つの非常に重要な原因です.
練習:スクリーンにランニングライトの文字を表示します.
参考答案:
import os
import time


def main():
    content = '           …………'
    while True:
        #         
        os.system('cls')  # os.system('clear')
        print(content)
        #   200  
        time.sleep(0.2)
        content = content[1:] + content[0]


if __name__ == '__main__':
    main()

練習:関数を設計して指定された長さの検証コードを生成し、検証コードは大文字と小文字と数字で構成されています.
参考答案:
import random


def generate_code(code_len=4):
    """
              

    :param code_len:       (  4   )

    :return:                    
    """
    all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    last_pos = len(all_chars) - 1
    code = ''
    for _ in range(code_len):
        index = random.randint(0, last_pos)
        code += all_chars[index]
    return code

練習:関数を設計して、指定したファイル名の接尾辞名を返します.
参考答案:
def get_suffix(filename, has_dot=False):
    """
             

    :param filename:    
    :param has_dot:             
    :return:       
    """
    pos = filename.rfind('.')
    if 0 < pos < len(filename) - 1:
        index = pos if has_dot else pos + 1
        return filename[index:]
    else:
        return ''

練習:関数を設計して、入力されたリストの最大および2番目に大きい要素の値を返します.
参考答案:
def max2(x):
    m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
    for index in range(2, len(x)):
        if x[index] > m1:
            m2 = m1
            m1 = x[index]
        elif x[index] > m2:
            m2 = x[index]
    return m1, m2

練習:指定された年月日を計算するのはこの年の何日目ですか.
参考答案:
def is_leap_year(year):
    """
                

    :param year:   
    :return:     True    False
    """
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0


def which_day(year, month, date):
    """
                   

    :param year:  
    :param month:  
    :param date:  
    :return:    
    """
    days_of_month = [
        [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    ][is_leap_year(year)]
    total = 0
    for index in range(month - 1):
        total += days_of_month[index]
    return total + date


def main():
    print(which_day(1980, 11, 28))
    print(which_day(1981, 12, 31))
    print(which_day(2018, 1, 1))
    print(which_day(2016, 3, 1))


if __name__ == '__main__':
    main()

練習:楊輝三角を印刷します.
参考答案:
def main():
    num = int(input('Number of rows: '))
    yh = [[]] * num
    for row in range(len(yh)):
        yh[row] = [None] * (row + 1)
        for col in range(len(yh[row])):
            if col == 0 or col == row:
                yh[row][col] = 1
            else:
                yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
            print(yh[row][col], end='\t')
        print()


if __name__ == '__main__':
    main()

練習1:クラス記述デジタルクロックを定義します.
参考答案:
from time import sleep


class Clock(object):
    """    """

    def __init__(self, hour=0, minute=0, second=0):
        """     

        :param hour:  
        :param minute:  
        :param second:  
        """
        self._hour = hour
        self._minute = minute
        self._second = second

    def run(self):
        """  """
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0

    def show(self):
        """    """
        return '%02d:%02d:%02d' % \
               (self._hour, self._minute, self._second)


def main():
    clock = Clock(23, 59, 58)
    while True:
        print(clock.show())
        sleep(1)
        clock.run()


if __name__ == '__main__':
    main()

練習2:クラス記述平面上の点を定義し、点を移動し、別の点までの距離を計算する方法を提供します.
参考答案:
from math import sqrt


class Point(object):

    def __init__(self, x=0, y=0):
        """     
        
        :param x:    
        :param y:    
        """
        self.x = x
        self.y = y

    def move_to(self, x, y):
        """       
        
        :param x:      
        "param y:      
        """
        self.x = x
        self.y = y

    def move_by(self, dx, dy):
        """       
        
        :param dx:       
        "param dy:       
        """
        self.x += dx
        self.y += dy

    def distance_to(self, other):
        """          
        
        :param other:     
        """
        dx = self.x - other.x
        dy = self.y - other.y
        return sqrt(dx ** 2 + dy ** 2)

    def __str__(self):
        return '(%s, %s)' % (str(self.x), str(self.y))


def main():
    p1 = Point(3, 5)
    p2 = Point()
    print(p1)
    print(p2)
    p2.move_by(-1, 2)
    print(p2)
    print(p1.distance_to(p2))


if __name__ == '__main__':
    main()

例1:ウルトラマンが怪獣を撃つ.
from abc import ABCMeta, abstractmethod
from random import randint, randrange


class Fighter(object, metaclass=ABCMeta):
    """   """

    #   __slots__               
    __slots__ = ('_name', '_hp')

    def __init__(self, name, hp):
        """     

        :param name:   
        :param hp:    
        """
        self._name = name
        self._hp = hp

    @property
    def name(self):
        return self._name

    @property
    def hp(self):
        return self._hp

    @hp.setter
    def hp(self, hp):
        self._hp = hp if hp >= 0 else 0

    @property
    def alive(self):
        return self._hp > 0

    @abstractmethod
    def attack(self, other):
        """  

        :param other:       
        """
        pass


class Ultraman(Fighter):
    """   """

    __slots__ = ('_name', '_hp', '_mp')

    def __init__(self, name, hp, mp):
        """     

        :param name:   
        :param hp:    
        :param mp:    
        """
        super().__init__(name, hp)
        self._mp = mp

    def attack(self, other):
        other.hp -= randint(15, 25)

    def huge_attack(self, other):
        """     (      50        )

        :param other:       

        :return:       True    False
        """
        if self._mp >= 50:
            self._mp -= 50
            injury = other.hp * 3 // 4
            injury = injury if injury >= 50 else 50
            other.hp -= injury
            return True
        else:
            self.attack(other)
            return False

    def magic_attack(self, others):
        """    

        :param others:       

        :return:         True    False
        """
        if self._mp >= 20:
            self._mp -= 20
            for temp in others:
                if temp.alive:
                    temp.hp -= randint(10, 15)
            return True
        else:
            return False

    def resume(self):
        """     """
        incr_point = randint(1, 10)
        self._mp += incr_point
        return incr_point

    def __str__(self):
        return '~~~%s   ~~~
' % self._name + \ ' : %d
' % self._hp + \ ' : %d
' % self._mp class Monster(Fighter): """ """ __slots__ = ('_name', '_hp') def attack(self, other): other.hp -= randint(10, 20) def __str__(self): return '~~~%s ~~~
' % self._name + \ ' : %d
' % self._hp def is_any_alive(monsters): """ """ for monster in monsters: if monster.alive > 0: return True return False def select_alive_one(monsters): """ """ monsters_len = len(monsters) while True: index = randrange(monsters_len) monster = monsters[index] if monster.alive > 0: return monster def display_info(ultraman, monsters): """ """ print(ultraman) for monster in monsters: print(monster, end='') def main(): u = Ultraman(' ', 1000, 120) m1 = Monster(' ', 250) m2 = Monster(' ', 500) m3 = Monster(' ', 750) ms = [m1, m2, m3] fight_round = 1 while u.alive and is_any_alive(ms): print('======== %02d ========' % fight_round) m = select_alive_one(ms) # skill = randint(1, 10) # if skill <= 6: # 60% print('%s %s.' % (u.name, m.name)) u.attack(m) print('%s %d .' % (u.name, u.resume())) elif skill <= 9: # 30% ( ) if u.magic_attack(ms): print('%s .' % u.name) else: print('%s .' % u.name) else: # 10% ( ) if u.huge_attack(m): print('%s %s.' % (u.name, m.name)) else: print('%s %s.' % (u.name, m.name)) print('%s %d .' % (u.name, u.resume())) if m.alive > 0: # print('%s %s.' % (m.name, u.name)) m.attack(u) display_info(u, ms) # fight_round += 1 print('
======== !========
') if u.alive > 0: print('%s !' % u.name) else: print(' !') if __name__ == '__main__': main()

ケース2:トランプゲーム.
import random


class Card(object):
    """   """

    def __init__(self, suite, face):
        self._suite = suite
        self._face = face

    @property
    def face(self):
        return self._face

    @property
    def suite(self):
        return self._suite

    def __str__(self):
        if self._face == 1:
            face_str = 'A'
        elif self._face == 11:
            face_str = 'J'
        elif self._face == 12:
            face_str = 'Q'
        elif self._face == 13:
            face_str = 'K'
        else:
            face_str = str(self._face)
        return '%s%s' % (self._suite, face_str)
    
    def __repr__(self):
        return self.__str__()


class Poker(object):
    """   """

    def __init__(self):
        self._cards = [Card(suite, face) 
                       for suite in '♠♥♣♦'
                       for face in range(1, 14)]
        self._current = 0

    @property
    def cards(self):
        return self._cards

    def shuffle(self):
        """  (    )"""
        self._current = 0
        random.shuffle(self._cards)

    @property
    def next(self):
        """  """
        card = self._cards[self._current]
        self._current += 1
        return card

    @property
    def has_next(self):
        """     """
        return self._current < len(self._cards)


class Player(object):
    """  """

    def __init__(self, name):
        self._name = name
        self._cards_on_hand = []

    @property
    def name(self):
        return self._name

    @property
    def cards_on_hand(self):
        return self._cards_on_hand

    def get(self, card):
        """  """
        self._cards_on_hand.append(card)

    def arrange(self, card_key):
        """        """
        self._cards_on_hand.sort(key=card_key)


#     -            
def get_key(card):
    return (card.suite, card.face)


def main():
    p = Poker()
    p.shuffle()
    players = [Player('  '), Player('  '), Player('  '), Player('  ')]
    for _ in range(13):
        for player in players:
            player.get(p.next)
    for player in players:
        print(player.name + ':', end=' ')
        player.arrange(get_key)
        print(player.cards_on_hand)


if __name__ == '__main__':
    main()

説明:上記のコードに基づいて簡単なトランプゲームを書いてみることができます.例えば、21時(Black Jack)、ゲームのルールは自分でネットで探すことができます.
ケース3:給与決済システム.
"""
                   、       
                           
            15000 
                   150 
       1200         5%   
"""
from abc import ABCMeta, abstractmethod


class Employee(object, metaclass=ABCMeta):
    """  """

    def __init__(self, name):
        """
             

        :param name:   
        """
        self._name = name

    @property
    def name(self):
        return self._name

    @abstractmethod
    def get_salary(self):
        """
            

        :return:   
        """
        pass


class Manager(Employee):
    """    """

    def get_salary(self):
        return 15000.0


class Programmer(Employee):
    """   """

    def __init__(self, name, working_hour=0):
        super().__init__(name)
        self._working_hour = working_hour

    @property
    def working_hour(self):
        return self._working_hour

    @working_hour.setter
    def working_hour(self, working_hour):
        self._working_hour = working_hour if working_hour > 0 else 0

    def get_salary(self):
        return 150.0 * self._working_hour


class Salesman(Employee):
    """   """

    def __init__(self, name, sales=0):
        super().__init__(name)
        self._sales = sales

    @property
    def sales(self):
        return self._sales

    @sales.setter
    def sales(self, sales):
        self._sales = sales if sales > 0 else 0

    def get_salary(self):
        return 1200.0 + self._sales * 0.05


def main():
    emps = [
        Manager('  '), Programmer('   '),
        Manager('  '), Salesman('  '),
        Salesman('  '), Programmer('  '),
        Programmer('  ')
    ]
    for emp in emps:
        if isinstance(emp, Programmer):
            emp.working_hour = int(input('   %s      : ' % emp.name))
        elif isinstance(emp, Salesman):
            emp.sales = float(input('   %s     : ' % emp.name))
        #      get_salary                    (  )
        print('%s     : ¥%s ' %
              (emp.name, emp.get_salary()))


if __name__ == '__main__':
    main()

Day 9になると、多くのものが食べきれないので、勉強を続けて今の段階のボトルネックを突破する時期があることを望んでいます.学習資料に感謝・・・