Wątek przeniesiony 2019-01-19 00:41 z Edukacja przez somekind.

Python dla każdego - zadania.

0
Krispekowy napisał(a):

Chyba teraz wszystko gra. Dzięki za pomoc.

# Jaka to liczba?
#
# Komputer wybiera losowo liczbę z zakresu od 1 do 100.
# Gracz próbuje ją odgadnąć, a komputer go informuje,
# czy podana przez niego liczba jest: za duża, za mała,
# prawidłowa.

import random  

print("\tWitaj w grze 'Jaka to liczba'!")
print("\nMam na myśli pewną liczbę z zakresu od 1 do 100.")
print("Spróbuj ją odgadnąć w jak najmniejszej liczbie prób.\n")

the_number = random.randint(1, 100)


# definicja zmiennej
def ask_the_number(guess):
    tries = 1
    while guess != the_number:
        if guess > the_number:
            print("Za duża...")
        else:
            print("Za mała...")
        tries += 1
        guess = int(input("Wprowadź liczbę: "))
    return tries

# kod główny
tries = ask_the_number(int(input("Wprowadź liczbę: ")))

print("Odgadłeś! Ta liczba to", the_number)
print("Do osiągnięcia sukcesu potrzebowałeś tylko", tries, "prób!\n")
  
input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

Ja to zadanie rozwiązałem w taki oto sposób, prócz dodania funkcji ask_number, dodałem jeszcze inne funkcje

import random
number = random.randint(1,100)

def welcome():
  print('Witaj w grze "Zgadnij jaka to liczba", zasady są proste... Musisz trafić liczbę w zakresie 1-100 którą komputer wylosował!\n Powodzenia!')


def ask_number():
  print("Wpisz liczbe z zakresu 1-100: ")
  tries = 1
  response = int(input())
  while response != number:
    if response < number:
      print("Za mała")
    else:
      print("Za duża")
    response = int(input('Spróbuj jeszcze raz: '))
    tries +=1
  return tries

def main():
  welcome()
  ask = ask_number()
  print("Udało Ci się odgadnąć",'ta liczba to',number,'odgadłeś za', ask,'razem')

main()


0

Cześć, jestem tu nowy i też zaczynam przygode z Pythonem. Zrobiłem zadanie odnośnie skilli które brzmi mniej wiecej tak:

Rozdział 5, zadanie nr 2
Napisz program Kreator postaci do gry z podziałem na role. Gracz powinien otrzymać pulę 30 punktów, którą może spożytkować na cztery atrybuty: siła, zdrowie, mądrość i zręczność. Gracz powinien mieć możliwość przeznaczania punktów z puli na dowolny atrybut, jak również możliwość odbierania punktów przypisanych do atrybutu i przekazywania ich z powrotem do puli.

Spędziłem na tym ponad 3 godziny. Jak by ktoś był miły i chciał zerknąć na kod czy jest w ogóle warty czegoś. Bardzo chętnie przeczytam myśl - nawet krytyczną odnośnie tego. Słowniki użyłem tylko po to żeby były, bo chyba autorowi zadania na tym zależało. Ale według mnie te słowniki są strasznie mało przydatne. Najlepsze są listy. Ale może jeszcze nie znam wszystkich możliwości list. Oto kod:

statystyki = {"sila":0, "zdrowie":0, "madrosc":0, "zrecznosc": 0} # słownik 
s = 0       # sila
z = 0       # zdrowie
m = 0       # mądrosc
zr = 0      # zręcznosc
punkty = 30
dalej = 1   # warunkuje czy główna petla sie odpali
klasa = ""





while dalej == 1:           # czyli "dalej" rozne od 1 zakonczy program


    # główne menu:

    
    print ("\n"
           "--------------------------------"
            "---------------------------------"
    "\nMasz: ", punkty, " punktow do rozdania")  
    print ("Co chcesz zrobic?")
    print ("1 - dodac punkty")
    print ("2 - zabrać punkty")
    print ("3 - sprawdzic jak wygladaja statystyki")
    print ("5 - wyjsc")
    decyzja_menu = int(input("Twoja decyzja: "))

    # Gdzie dodac punkty?
    
    while decyzja_menu == 1:
        print ("Masz jeszcze: ", punkty, " punktów")
        print ("Gdzie chcesz rozdac punkty?"
        "\n1 - Sila, 2 - zdrowie, 3 - madrosc, 4 - zrecznosc"
        " /// 9 - wystarczy")
        decyzja_dodawanie = int(input("--------------------------------"
                                      "---------------------------------"
                                      "\nWybieram "))
        # Dodawanie punktow

        if decyzja_dodawanie == 1:
            if punkty > 0:
                s += 1
                punkty -= 1
                print ("Masz juz ", s, "sily")
            
        if decyzja_dodawanie == 2:
            if punkty > 0:
                z += 1
                punkty -= 1
                print ("Masz juz ", z, "zdrowia")

        if decyzja_dodawanie == 3:
            if punkty > 0:
                m += 1
                punkty -= 1
                print ("Masz juz ", m, "madrosci")

        if decyzja_dodawanie == 4:
            if punkty > 0:
                zr += 1
                punkty -= 1
                print ("Masz juz ", zr, "zrecznosci")
        
        if punkty < 1:
            print ("\n\t\tRozdales juz wszystkie punkty!!!\n")

        # powrót do głównego menu i zapisywanie statystyk do slownika

        if decyzja_dodawanie == 9:
            decyzja_menu = 4
            print ("Ok, konczymy dodawanie")
            statystyki["sila"] = s
            statystyki["zdrowie"] = z
            statystyki["madrosc"] = m
            statystyki["zrecznosc"] = zr
            print ("Masz teraz :", statystyki)
            
    # Wybór skad odjac punkty

               
    while decyzja_menu == 2:
        print ("Masz jeszcze: ", punkty, " punktów")
        print ("\nSkad chcesz zabrac punkty?"
        "\n1 - Sila, 2 - zdrowie, 3 - madrosc, 4 - zrecznosc"
        " 9 - wystarczy")
        decyzja_odejmowanie = int(input("--------------------------------"
                                      "---------------------------------"
                                      "\nWybieram "))

        # Odejmowanie punktow
        
        if decyzja_odejmowanie == 1:
            if punkty < 30 and s > 0:
                s -= 1
                punkty += 1
                print ("Masz juz tylko", s, "sily")
            if s == 0:
                print ("\n\t\tNie mozesz juz wiecej zabrac!\n")
                
        if decyzja_odejmowanie == 2:
            if punkty < 30 and z > 0:
                z -= 1
                punkty += 1
                print ("Masz juz tylko", z, "zdrowia")
            if z == 0:
                print ("\n\t\tNie mozesz juz wiecej zabrac!\n")
                       
        if decyzja_odejmowanie == 3:
            if punkty < 30 and m > 0 :
                m -= 1
                punkty += 1
                print ("Masz juz tylko ", m, "madrosci")
            if m == 0:
                print ("\n\t\tNie mozesz juz wiecej zabrac!\n")
                       
        if decyzja_odejmowanie == 4:
            if punkty < 30 and zr > 0:
                zr -= 1
                punkty += 1
                print ("Masz juz tylko", zr, "zrecznosci")
            if zr == 0:
                print ("\n\t\tNie mozesz juz wiecej zabrac!\n")
                       
        if decyzja_odejmowanie == 9:
            decyzja_menu = 4
            print ("Ok, konczymy odejmowanie")
            statystyki["sila"] = s
            statystyki["zdrowie"] = z
            statystyki["madrosc"] = m
            statystyki["zrecznosc"] = zr
            print ("Masz teraz :", statystyki)

        if punkty == 30:
            print ("\n\t\tJuz zabrales wszystkie punkty!!!\n")

    # pokazanie statystyk w petlach for

    if decyzja_menu == 3:
        print (statystyki)
        print ("\n --------------------------------"
                "---------------------------------"
               "\nTwoje statystyki: ")
        print ("\nSila :", s)
        for i in range (s):
            print ("[><]", end="")

        print ("\nZdrowie :", z)
        for i in range (z):
            print ("[><]", end="")

        print ("\nMadrosc :", m)
        for i in range (m):
            print ("[><]", end="")

        print ("\nZręcznosc :", zr)
        for i in range (zr):
            print ("[><]", end="")


        if s > 8 and z > 8 and m > 8:
            klasa = "mag_bitewny"
        elif m > 9 and zr > 9:
            klasa = "medyk"
        elif s > 8 and z > 8 and zr > 8:
            klasa = "żołnierz_elitarny"
        elif s > 12 and z > 10:
            klasa = "olbrzym"
        elif s > 10 and zr > 10:
            klasa = "krasnolud_technik"
        elif z > 10 and m > 10:
            klasa = "czarnoksieznik"
        elif s > 10:
            klasa = "osiłek"
        elif z > 10 and m >8:
            klasa = "krasnolud_mag"
        elif z > 10:
            klasa = "krasnolud_wojownik"
        elif z > 10 and m >8:
            klasa = "krasnolud_mag"
        elif m > 10:
            klasa = "medrzec"
        elif zr > 12:
            klasa = "łucznik"
        elif s > 12 and z > 10:
            klasa = "olbrzym"
        elif s > 10 and zr > 10:
            klasa = "krasnolud_technik"
        elif z > 10 and m > 10:
            klasa = "czarnoksieznik"
        else:
            klasa = "nikt_szczególny"
            

        print ("\n\t\tTwoja klasa to: ",klasa)

    # wyjscie:
    
    if decyzja_menu == 5:
          print ("Ok koniec zabawy, dzieki za przetestowanie!!! :)")
          dalej = 2   # "dalej" rózne od 1 to wyjscie


             
            

            
            
        
        

         
                                
        




0

Można by tekst początkowy wyświetlić jedną instrukcją print a wcześniej zgromadzić cały tekst w łańcuchu wielowierszowym. W ten sposób oszczędzasz niepotrzebne skoki i śmieci na stosie.

tekscik='''Linia pierwsza
Linia druga
Linia trzecia
...'''
print tekscik

To jest Python 2, ale jak działa też na trójce tylko instrukcja print wygląda inaczej.

0

Dzięki Manna za rade. Faktycznie dobry trick ;)

0
Wenzon napisał(a):

Ale według mnie te słowniki są strasznie mało przydatne.

Bo nie wiesz jeszcze jak ich używać.

Kilka uwag:

  1. Jak już używasz dict to niepotrzebne są te zmienne s, z etc. Powinieneś te zmienne zapisywać w bezpośrednio w statystyki.
statystyki['zdrowie'] = 0
statystyki['zdrowie'] += 1

Swoją drogą nie nazywaj zmiennych jedną literką bo nie wiadomo co to jest.

  1. Używaj funkcji! Kod który jest rozbity na funkcje jest bardziej czytelny i zwięzły. Na przykład ten kod który jest odpowiedzialny za przydzielanie punktów można zamienić na coś takiego:
# funkcja która zajmuje się odejmowaniem i dodawaniem punktów
def zmien_statystyki(staty_dict, cecha, punkty, operacja):
    if operacja == '+':
        if punkty < 1:
            print('Brak punktów do rozdania')
            return staty_dict, punkty
        staty_dict[cecha] += 1
        punkty -= 1

    if operacja == '-':
        if staty_dict[cecha] < 1:
            print('Nie można odjac punktow')
            return staty_dict, punkty
        staty_dict[cecha] -= 1
        punkty += 1
    wyswietl_staty(staty_dict, punkty)
    return staty_dict, punkty


def wybierz_ceche(staty_dict):
    while True:
        cecha = input('Wybierz cechę: \n{}'.format('\n'.join(statystyki.keys())))

        # sprawdz czy wybrana cecha jest w słowniku
        if cecha in staty_dict:
            return cecha
        else:
            print('Niepoprawna nazwa cechy. Cechy do wyboru:\n{}'.format('\n'.join(staty_dict.keys())))


def wybierz_operacje():
    OPERACJE = ['+', '-', 'Q']

    while True:
        operacja = input('Wybierz operację: \n"+": dodaj punkty\n"-": odejmij punkty\n"Q": koniec')
        # sprawdz czy wybrana operacja jest poprawna
        if operacja in OPERACJE:
            return operacja
        else:
            print('Niepoprawna operacja. Wybierz operację z listy: \n{}'.format('\n'.join(OPERACJE)))


def wyswietl_staty(staty_dict, punkty):
    print('*' * 50)
    for cecha in staty_dict:
        print('{}: {}'.format(cecha, staty_dict[cecha]))
    print('Punkty do rozdania: {}'.format(punkty))
    print('*' * 50)


OPERACJE = ['+', '-']

statystyki = {'sila': 0,
              'zdrowie': 0,
              'zrecznosc': 0,
              'madrosc': 0}
punkty = 10

while True:
    operacja = wybierz_operacje()
    # opusc petle
    if operacja == 'Q':
        break
    cecha = wybierz_ceche(statystyki)
    statystyki, punkty = zmien_statystyki(statystyki, cecha, punkty, operacja)
  1. Staraj się nie nadużywać ifów bo ciężko się to czyta i utrzymuje taki kod. Poza tym jest niepotrzebnie rozległy. Tą ostatnią część można zapisać w taki sposób:
def przydziel_klase(staty_dict):
    KLASY = {
        'medyk': {
            'madrosc': 9,
            'zrecznosc': 9
        },
        'mag_bitewny':{
            'sila': 8,
            'zdrowie': 8,
            'madrosc': 8},
    }
    for klasa in KLASY:
        passed = True
        for cecha in KLASY[klasa]:
            if not staty_dict[cecha] > KLASY[klasa][cecha]: # sprawdz czy warunki sa spelnine
                passed = False
                break # przejdz do nastepnej klasy
        if passed:
            print('Przydzielona klasa: {}'.format(klasa))
            return klasa
    print('dupa a nie wojownik z ciebie jest')

statystyki = {'sila': 7,
              'zdrowie': 9,
              'zrecznosc': 10,
              'madrosc': 9}

przydziel_klase(statystyki)
0

Witam, stawiam pierwsze kroki w programowaniu. Mam do wykonania zadanie polegające na zapisaniu w języku Python algorytmu obliczającego, ile elementów w ciągu jest większych od średniej. Będę wdzięczny za wszelakie wskazówki! Pozdrawiam Was serdecznie i życzę wszystkiego dobrego w nowym roku!

0
Luigi_Capogrossi napisał(a):

Witam, stawiam pierwsze kroki w programowaniu. Mam do wykonania zadanie polegające na zapisaniu w języku Python algorytmu obliczającego, ile elementów w ciągu jest większych od średniej. Będę wdzięczny za wszelakie wskazówki! Pozdrawiam Was serdecznie i życzę wszystkiego dobrego w nowym roku!

  1. Oblicz średnią i zapisz ją do zmiennej
  2. Stwórz nową zmienną i ustaw jej wartość na 0
  3. Przejdź po każdym elemencie ciągu (słowo kluczowe: for ... in ...) i jeśli ten element jest większy od średniej (słowo kluczowe: if) zwiększ wartość zmiennej z pkt. 2 o 1
  4. Wypisz wartość zmiennej z pkt. 2
0
Luigi_Capogrossi napisał(a):

Witam, stawiam pierwsze kroki w programowaniu. Mam do wykonania zadanie polegające na zapisaniu w języku Python algorytmu obliczającego, ile elementów w ciągu jest większych od średniej. Będę wdzięczny za wszelakie wskazówki! Pozdrawiam Was serdecznie i życzę wszystkiego dobrego w nowym roku!

>>> import statistics
>>> input = [1, 2, 3, 3, 4, 4, 5, 6, 7]
>>> mean = statistics.mean(input)
>>> len([i for i in input if i > mean])
5
0

Ile elementów większych od średniej?

moja_lista=[1,2,3,4,5] # tu w wybrany sposob, int(raw_input()), input(), easygui.integerbox() itd. wprowadz dane liczbowe

suma=0
for elem in moja_lista:
     suma+=elem
dlugosc=len(moja_lista)
srednia=suma/dlugosc
wieksze_od_sredniej=[]
for elem in moja_lista:
    if elem>srednia:
        wieksze_od_sredniej.append(elem)

ile_wiekszych_od_sredniej=len(wieksze_od_sredniej)
print str(ile_wiekszych_od_sredniej)+" elementow przekracza srednia." # albo msgbox czy jeszcze inaczej

A notacja [i for i in input if i > mean], nawet jeśli działa jest za trudna do zrozumienia.

0
Manna5 napisał(a):

Ile elementów większych od średniej?

moja_lista=[1,2,3,4,5] # tu w wybrany sposob, int(raw_input()), input(), easygui.integerbox() itd. wprowadz dane liczbowe

suma=0
for elem in moja_lista:
     suma+=elem
dlugosc=len(moja_lista)
srednia=suma/dlugosc
wieksze_od_sredniej=[]
for elem in moja_lista:
    if elem>srednia:
        wieksze_od_sredniej.append(elem)

ile_wiekszych_od_sredniej=len(wieksze_od_sredniej)
print str(ile_wiekszych_od_sredniej)+" elementow przekracza srednia." # albo msgbox czy jeszcze inaczej

A notacja [i for i in input if i > mean], nawet jeśli działa jest za trudna do zrozumienia.

Sorry @Manna5, ale to raczej słaby przykład.

  1. W Pythonie nie sumuje się elementów listy iterując po niej, bo istnieje wbudowana funkcja sum:
>>> moja_lista=[1,2,3,4,5] 
>>> sum(moja_lista)
15
  1. Dzielenie srednia=suma/dlugosc będzie całkowitoliczbowe w Pythonie 2.7 (o ile się nie zaimportuje z futures)
$ python2.7
Python 2.7.16 (default, Oct  7 2019, 17:36:04) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 10/3
3
>>> from __future__ import division
>>> 10/3
3.3333333333333335
  1. W Pythonie unika się konkatenacji napisów na rzecz metody .format() (od wersji 3.6 również f-stringów). Wtedy nie trzeba konwertować liczby do napisu z str
print('{} lementow przekracza srednia.'.format(ile_wiekszych_od_sredniej))
  1. Jako pro-koderzy powinniśmy w ogóle stosować angielskie nazwy zmiennych
  2. print powinno się wywoływać z nawiasami, żeby działał i w wersji 3
$ python3
Python 3.7.3 (default, Oct  7 2019, 12:56:13) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1
  File "<stdin>", line 1
    print 1
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(1)?
  1. List comprehension to podstawa Pythonicznego stylu, będzie czytelniejszy dla każdego użytkownika języka i preferowany od klasycznego podejścia rodem z C
0

Z funkcją sum, formatowaniem i angielskimi nazwami algorytm prezentuje się tak (przy okazji bardziej naturalny komunikat):

my_data=[1,2,3,4,5] # tu w wybrany sposob, int(raw_input()), input(), easygui.integerbox() itd. wprowadz dane liczbowe

average=sum(my_data)/len(my_data)
greater_than_avg=[]
for item in my_data:
    if item>average:
        greater_than_avg.append(item)

number_of_items_greater_than_avg=len(greater_than_avg)
print("%d ponadprzecietnych elementow".format(number_of_items_greater_than_avg))  # albo msgbox czy jeszcze inaczej

Możliwy błąd w formatowaniu, to z braku przyzwyczajenia bo na codzień uważam że ta technika jest nieopłacalna.

0

Rozdział 6 zadanie numer 3
Napisz program Kto jest twoim tatą?, który umożliwia użytkownikowi wprowadzenie imienia i nazwiska osoby płci męskiej i przedstawia imię i nazwisko jej ojca. (Możesz dla zabawy wykorzystać nazwiska celebrytów, osób fikcyjnych lub nawet postaci historycznych). Umożliw użytkownikowi dodawanie, wymianę i usuwanie par syn-ojciec.
Rozdział 6 zadanie numer 4
Udoskonal program Kto jest moim tatą? poprzez dodanie opcji, która umożliwi użytkownikowi wprowadzenie imienia i (lub) nazwiska jakiejś osoby i uzyskanie odpowiedzi, kto jest jej dziadkiem. Twój program powinien nadal wykorzystywać tylko jeden słownik par syn-ojciec. Pamiętaj, aby włączyć do swojego słownika kilka pokoleń, tak aby możliwe było tego rodzaju dopasowanie.

Mam problem dotyczący zadania numer 4:

# program umożliwia użytkownikowi wprowadzenie imienia i nazwiska osoby płci męskiej
# i przedstawia nazwisko jej Ojca
# ver 2.0 pozwala na wyświetlenie imienia i nazwiska Dziadka
print(
    """
        Witaj w programie 'Who's your Grandpa?'
        
    0 - Zakończ program
    1 - Dodaj parę syn-ojciec
    2 - Edytuj parę syn-ojciec
    3 - Usuń parę syn-ojciec
    4 - Sprawdź nazwisko swojego Ojca
    5 - Sprawdź nazwisko swojego Dziadka
    """)
# Tworzenie słownika i zmiennych
pairs ={"Dolph Lundgren": "Karl Lundgren","Karl Lundgren" :"Papa Lundgren", "Arnold Schwarzenegger":"Gustav Schwarzenegger",
        "Gustav Schwarzenegger":"Papa Shwarzenegger","Sylvester Stallone": "Frank Stallone", "Frank Stallone":"Papa Stallone"}
choice = None
#pętla programu
while choice != 0:
    choice = input("\nWybierasz: ")
    if choice == "0":
        print("\nŻegnaj.")
    elif choice == "1":
        son = input("\nWpisz swoje imię i nazwisko: ")
        if son not in pairs:
            father = input("\nWpisz imię i nazwisko swojego Ojca: " )
            pairs[son] = father
            print("\nDane Ojca dla:", son, "zostały dodane.")
        else:
            print("\nDane syna o tym imieniu i nazwisku już istnieją. Wybierz opcję Edytuj.")
    elif choice == "2":
        son = input("\nWpisz swoje imię i nazwisko w celu edycji danych o Ojcu: ")
        if son in pairs:
            father = input("\nWpisz imię i nazwisko swojego Ojca w celu edycji: " )
            pairs[son] = father
            print("\nDane Ojca dla:", son, "zostały edytowane.")
        else:
            print("\nDane o Ojcu dla",son, "nie znajdują się w bazie. Wybierz opcję Dodaj.")
    elif choice == "3":
        son = input("\nWprowadź swoje imię i nazwisko w celu usunięcia danych o Ojcu: ")
        if son in pairs:
            del pairs[son]
            print("\nDane Ojca dla", son, "zostały usunięte.")
        else:
            print("\nDane o Ojcu dla",son, "nie znajdują się w bazie.")
    elif choice == "4":
        son = input("\nWpisz swoje imię i nazwisko, aby uzyskać imię i nazwisko swojego Ojca: ")
        if son in pairs:
            print("\nImię i nazwisko Twojego Ojca to: ",pairs[son])
        else:
            print("\nBrak danych o Ojcu dla: ", son)
    elif choice == "5":
        son = input("\nWpisz swoje imię i nazwisko, aby uzyskać imię i nazwisko swojego Dziadka: ")
        print("\nImię i nazwisko Twojego Dziadka to: ", pairs.get(pairs[son],"Brak danych o Dziadku"))
else:
    print("\nNieprawidłowy wybór.")
    
input("\nAby zakończyć program naciśnij klawisz Enter.")   

w 55 wierszu:

print("\nImię i nazwisko Twojego Dziadka to: ", pairs.get(pairs[son],"Brak danych o Dziadku"))

skorzystałem z metody get() jak radził iksde kilka lat temu przy tym zadaniu, aby mieć pewność, iż w sytuacji wpisania klucza, który nie istnieje zwrócona zostanie zdefiniowana przeze mnie wartość domyślna, tak się jednak nie dzieje. Metoda get() w tym przypadku działa gdy podam poprawny klucz, lecz gdy podam klucz który nie istnieje program wyświetla KeyError: dla podanego klucza zamiast zdefiniowanej przeze mnie wartości domyślnej. Ktoś podpowie?

0
print("\nImię i nazwisko Twojego Dziadka to: ", pairs.get(pairs[son],"Brak danych o Dziadku"))

KeyError wywala się na pairs[son], a nie na pairs.get(cośtam, cośtam). Musisz sprawdzić jedno i drugie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1