Уведомления

Группа в Telegram: @pythonsu

#1 Май 7, 2012 15:39:40

Amazzzonka
Зарегистрирован: 2012-04-17
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

ну вот наконец-то я вроде как решила задачку с генератором персонажей и навояла трехкилометровый код (уверена, что его можно сократить буквально до трех строчек, но я пока не знаю, как…)

жду ваших комментариев!

Прикреплённый файлы:
attachment hero_003_ex.py (5,2 KБ)

Офлайн

#2 Май 7, 2012 17:56:03

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

Amazzzonka
ну вот наконец-то я вроде как решила задачку с генератором персонажей и навояла трехкилометровый код (уверена, что его можно сократить буквально до трех строчек, но я пока не знаю, как…)

жду ваших комментариев!
Первый взгляд на код:
1.
value01=hero[0][1]
value02=hero[1][1]
value03=hero[2][1]
value04=hero[3][1]
Это у Вас 4 раза, однозначно в функцию
2.
elif reply == 1:
elif reply == 2:
elif reply == 3:
elif reply == 4:
Не айс, просится словарь
ACTIONS={
1:func1
2:Func2
}
3.
if reply == 0:
Фуфуфуфуфу,
если reply ==0 то она уже False





Офлайн

#3 Май 7, 2012 23:17:04

Amazzzonka
Зарегистрирован: 2012-04-17
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

Спасибо за помощь!
Вот новый вариант программы. Подскажите, плз, как можно реализовать идею с функциями в словаре.

Так, чтобы можно было использовать словарь подобной структуры:

ACTIONS = {
1:function_1,
2: function_2,
...
x: function_x}

Прикреплённый файлы:
attachment hero_003_ex.py (2,6 KБ)

Офлайн

#4 Май 8, 2012 08:40:58

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

Есть возможность записывать в словарь объекты созданных функций по ключу(т.е. писать без скобочек):

def fuction_1():
    #тело функции
    return #результат
def fuction_2():
    #тело функции
    return #результат
def fuction_x():
    #тело функции
    return #результат
ACTIONS = {
1:function_1,
2: function_2,
...
x: function_x}

Есть возможность в самом словаре записывать по ключу lambda-выражения:
ACTIONS =  {
...     'first':lambda x: x+1,
...     'second':lambda y,w: y+w,
...     'third':lambda l: l/2.0}
q=ACTIONS['first']
q(4)
5
ACTIONS['second'](7,11.5)
18.5
ACTIONS['third'](3)
1.5
версия python 2.7.3

Отредактировано buddha (Май 8, 2012 08:41:40)

Офлайн

#5 Май 10, 2012 13:09:29

Amazzzonka
Зарегистрирован: 2012-04-17
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

УРРРА! Получилось!)))
Вот она, доработанная в согласии со всеми вашими рекомендациями

Прикреплённый файлы:
attachment hero_003_ex.py (2,7 KБ)

Офлайн

#6 Май 10, 2012 13:28:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

Amazzzonka
УРРРА! Получилось!)))
Вот она, доработанная в согласии со всеми вашими рекомендациями :D
Объясните, пожалуйста, великий смысл сего действа
reply%1==0
Долго думал, так и не понял



Офлайн

#7 Май 10, 2012 14:40:11

Amazzzonka
Зарегистрирован: 2012-04-17
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

FishHook
Объясните, пожалуйста, великий смысл сего действа
reply%1==0
ну это чтобы пользователь не ввел какое-нибудь дробное значение в дозволенных пределах, например, 1,5.

Офлайн

#8 Май 10, 2012 15:15:17

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

value01=hero[0][1]
value02=hero[1][1]
value03=hero[2][1]
value04=hero[3][1]
…, value05, value06, …, value198, value199, …, value981, value982, …

total=int(hero[0][1]+hero[1][1]+hero[2][1]+hero[3][1])
sum?
comprehensions?

answer%1==0
isinstance? (Не всматривался, но вроде у вас все входные значения под int() - дроби там не будет.)

for item in range(0, len(hero)):
        name = hero[item][0]
        print((item+1), ' - ', name)

- range(0, x) == range(x)
- enumerate?

hero = [['Сила', 0], ['Ловкость', 0], ['Мудрость', 0], ['Здоровье',0]]
Перепутали список со словарем :)

Из общих фраз:
- Использовать словари.
- Убрать глобальные переменные и прочий мешающий чтению кода мусор (условия в if/while и тд). Ввести ООП.
- Поменьше магических цифр и индексов.
- Подучить стандартные функции и методы.
- Пользоваться тегами code.

В общем, хорошо, что пробуете, пишете, но советую более внимательно изучать язык, если стоит задача освоить его. Удачи!



Отредактировано fata1ex (Май 10, 2012 15:21:01)

Офлайн

#9 Май 15, 2012 22:20:42

Amazzzonka
Зарегистрирован: 2012-04-17
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

Спасибо за советы! Правда, я пока еще мало что поняла, но главное - понятно - не останавливаться!)))

Вот передо мной новая задачка (из того же учебника). В самом учебнике разбиралась игра “Викторина”, в которой задания брались из текстового файла.
Задача №1. Для каждого вопроса сделать “номинал” и в конце выдать пользователю результат игры как сумму номиналов вопросов, на которые он ответил правильно. (это мной было реализовано вроде как успешно, т.к. код делает то, что я хотела)
Задание №2. Доработайте игру т.о., чтобы она хранила в файле список рекордов. В список должны попадать имя и результат игрока-рекордсмена. Используйте для хранения таблицы рекордов консервированный объект. (т.к. в данной главе разбирались модули pickle и shelve, то автор наверняка предполагает их использование)
И вот тут проблема: вроде задание простое, а код работает неправильно(((
Что не так?

Вот код:

# Trivia Challenge
# Trivia game that reads a plain text file
import sys, pickle, shelve
def open_file(file_name, mode):
    """Open a file."""
    try:
        the_file = open(file_name, mode)
    except IOError as e:
        print("Unable to open the file", file_name, "Ending program.\n", e)
        input("\n\nPress the enter key to exit.")
        sys.exit()
    else:
        return the_file
def next_line(the_file):
    """Return next line from the trivia file, formatted."""
    line = the_file.readline()
    line = line.replace("/", "\n")
    return line
def next_block(the_file):
    """Return the next block of data from the trivia file."""
    category = next_line(the_file)
    
    question = next_line(the_file)
    
    answers = []
    for i in range(4):
        answers.append(next_line(the_file))
        
    correct = next_line(the_file) #c. 217 - неправильная табуляция!!!
    if correct:
        correct = correct[0]
    score = next_line(the_file)
    if score:
        score = int(score)
        
    explanation = next_line(the_file) 
    return category, question, answers, correct, score, explanation
def welcome(title):
    """Welcome the player and get his/her name."""
    print("\t\tWelcome to Trivia Challenge!\n")
    print("\t\t", title, "\n")
 
def main():
    trivia_file = open_file("trivia.txt", "r")
    title = next_line(trivia_file)
    welcome(title)
    scores = 0
    records = []
    name = input('Hello! What\'s your name? ')
    # get first block
    category, question, answers, correct, score, explanation = next_block(trivia_file)
    while category:
        # ask a question
        print(category)
        print(question)
        print('If you give right answer you\'ll get ', score, 'points.\n\n')
        for i in range(4):
            print("\t", i + 1, "-", answers[i])
        # get answer
        answer = input("What's your answer?: ")
        # check answer
        if answer == correct:
            print("\nRight!", end=" ")
            scores += score
        else:
            print("\nWrong.", end=" ")
        print(explanation)
        
        print("Score:", scores, "\n\n")
        # get next block
        category, question, answers, correct, score, explanation = next_block(trivia_file)
    trivia_file.close()
    print("That was the last question!")
    print("You're final score is", scores)
    record = (scores, name) # создает список рекордов
    records.append(record)
    records.sort(reverse=True)
    f = open('records.dat', 'ab')
    pickle.dump(records,f)
    f.close()
    f = open('records.dat', 'rb')
    records = pickle.load(f)
    print('NAME\t\tSCORES')
    for i in records:
        record, name = i
        print(name, '\t\t', record)
    f.close()
    
 
main()  
input("\n\nPress the enter key to exit.")

а в приложенном файле - вопросы к игре.

Прикреплённый файлы:
attachment trivia.txt (1,5 KБ)

Офлайн

#10 Май 24, 2012 08:58:08

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

Python детсадовского уровня (циклы, кортежи, списки)

по первой задаче:
может, так?

import random
script = ['life','mountain','spirit','reason','wind','guitar','eagle','rainbow']
random.shuffle(script)
for x in script:
    print x

Отредактировано asphix (Май 24, 2012 09:14:29)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version