1 Востаннє редагувалося Invader (23.12.2012 16:50:29)

Тема: Наскільки цей код пітонічий?

Захотілося мені тут трохи повчити Python. І виникла так задача: створити функцію яка приймає довільну к-ть параметрів, по черзі виводить їх всі на екран (як запрошення ком. рядка) і доки користувач не введе число чи букву програма знову і знову виводить на екран запрошення ввести дані для параметру. Тобто текст параметру функції асоційований з певною змінною. Якщо всі змінні містять афавітночислові дані, то вони повертаються туди звідки їх викликали.

Після написання функції захотілося дізнатися наскільки код відповідає Python way.

Код:

#!/usr/bin/python3
var = ['Input1','Input2','Input2']
def w(var):
    r = []#можна якось обійтися без додаткового списку?
    while len(r) != len(var):
        r.append(None)

    for i in range(len(r)):
        while not r[i]:
            r[i]=input(var[i] + ':' + ' ').strip()#ввід від користувача має містити тільки числа і/або букви
    return r
input1,input2,input3 = w(var)
print(input1,input2,input3)

2

Re: Наскільки цей код пітонічий?

Зробив деякі покращення.

  1. Змінні можна називати трішки краще.

  2. Після коми зазвичай прийнято ставити пробіл, також пробілами виділяти оператори =, +, і подібні.

var = ['Input1', 'Input2', 'Input2']

def get_variables(names):
    res = [None] * len(names) # Список помножений на число - це той же список повторений число раз
     
    for i, name in enumerate(names): # пітонічний спосіб отримувати індекс та елемент парами.
        while not res[i]: # це було б круто винести в окрему функцію input_not_empty()
            res[i] = input(name + ': ').strip() # не обов'язково було додавати кожен символ окремо. 
    return res

input1, input2, input3 = get_variables(var)
print(input1, input2, input3)

Все решта - gut gemaht!

Хоча, можна і без додаткового списку.

3

Re: Наскільки цей код пітонічий?

Без додаткового списку:

var = ['Input1', 'Input2', 'Input2']

def get_variables(names):
    for name in names:
        res = None
        while not res:
            res = input(name + ': ').strip()
        yield res

input1, input2, input3 = get_variables(var)
print(input1, input2, input3)

Генератори рулять

Подякували: Invader1

4 Востаннє редагувалося Invader (24.12.2012 00:37:37)

Re: Наскільки цей код пітонічий?

Дякую. Виглядає круто. Не працює з одним елементом. Треба нарешті почитати про ці генератори. Вірніше працює, але не зовсім так як хотілося б.

5

Re: Наскільки цей код пітонічий?

Ааа, так, з одним елементом є прикол, для нього треба писати присвоєння так:

input1, = get_variables(var)

Знайдіть одну відмінність з

input1 = get_variables(var)

Підказка - кортеж з одного елемента і один елемент - це не одне і те ж. :)

Подякували: Invader1

6

Re: Наскільки цей код пітонічий?

Дякую. Сам би не додумався. Я писав так

input1 = get_variables(['var', ])

але воно звісно не працювало. Тож прийшов до варінту з циклом for.