41 Востаннє редагувалося P.Y. (31.03.2016 22:52:31)

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

Ну, насправді красивіше було б так:

frange=lambda minval, maxval, step:map(lambda x: x*step, range(int(minval/step), int(maxval/step)))

for i in frange(1234, 1342, 0.1):
    print(i)

while тут точно зайвий.

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

42

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

оце так лайно, і чому б просто не зробити шось типу

for i in range(0,1,0.1)

?? оце срака..

43

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

FakiNyan написав:

оце так лайно, і чому б просто не зробити шось типу

for i in range(0,1,0.1)

?? оце срака..

frange, який я описав вище, далі можна саме так і використовувати.

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

44

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

порадьте мені якусь просту лібу для малювання, мені тре буде просто малювати лінії і карпочки в віконці

45

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

Зі стандартних перше, що згадується — turtle.

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

46

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

P.Y. написав:

Зі стандартних перше, що згадується — turtle.

а там мона по пікселям малювати?

47

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

FakiNyan написав:
P.Y. написав:

Зі стандартних перше, що згадується — turtle.

а там мона по пікселям малювати?

goto(x,y); dot()
Подякували: FakiNyan1

48

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

http://www.u.arizona.edu/~rubinson/copy … rmful.html

49

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

теж хтів про це написати

50

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

Трохи вдосконалив frange (у попередньому варіанті він міг на деяких параметрах вилазити за межі діапазону)

frange=lambda minval, maxval, step:map(lambda x: x*step+minval, range(int((maxval-minval)/step)))

51

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

P.Y. написав:

Ну, насправді красивіше було б так:
[code]
frange=lambda minval, maxval, step:map(lambda x: x*step, range(int(minval/step), int(maxval/step)))

for i in frange(1234, 1342, 0.1):
    print(i)
[/code]
while тут точно зайвий.

для такої задачі є NumPy.
напр
np.arange(1, 5, 0.5)

Прихований текст

там ще є прікольна особливість, що масиви можна множити на числа
типу: b = my_nparray * 5

а якщо хочете зекономити оперативку у форах то треба писати ітератори типу:
[code=Python]class frange():
    def __init__(self, start, stop, step):
        self.start = start
        self.step = step
        self.iterator = iter(range(int((stop - start) / step)))

    def __iter__(self):
        return self

    def __next__(self):
        return self.start + next(self.iterator) * self.step


print(frange(1, 5, 0.5))
print(list(frange(1, 5, 0.5)))[/code]

результат:
[code]<__main__.frange object at 0x7f65921114a8>
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5][/code]

П. С.

imho генератори в пайтоні виглядають природніше за map(), а звичайні функції краще за лямбди.
не розумію для чого рядки економити.

ППС: тут map() навіть довшим буде:
[code]map(lambda x: x*step, range(int(minval/step), int(maxval/step)))
[x * step for x in range(int(minval/step), int(maxval/step))][/code]

52

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

а якщо хочете зекономити оперативку у форах то треба писати ітератори типу

map також повертає ітератор, а не список — тобто, розписування ітератора руками якоїсь помітної економії пам'яті порівняно з map не дасть.

Подякували: koala, ADR2

53

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

P.Y. написав:

а якщо хочете зекономити оперативку у форах то треба писати ітератори типу

map також повертає ітератор, а не список — тобто, розписування ітератора руками якоїсь помітної економії пам'яті порівняно з map не дасть.

Справді. Нєфіг було щось писати перед сном)

54

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

[x * step for x in range(int(minval/step), int(maxval/step))]

А ось так справді генерується масив, який забирає оперативку. Щоб отримати ітератор, достатньо замінити квадратні дужки на круглі:

(x * step for x in range(int(minval/step), int(maxval/step)))
Подякували: koala, leofun01, ADR3

55

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

quez написав:

Чим таке "перевантаження" відрізняється від оголошення з змінною кількістю аргументів?

Взагалі-то, це працює й для функцій з різнотипними аргументами:

from fntools import overload # fntools - модуль, у якому я розмістив код з першої сторінки цієї теми

def kvadrat(n):
    return n*n
    
@overload(kvadrat)
def kvadrat(s):
    m=int(len(s)**.5)
    while m*m<len(s):
        s+='.'
        m=int(len(s)**.5)
    return '+'+'-'*m+'+\n|'\
    +'|\n|'.join((s[i:i+m] for i in range(0, len(s), m)))\
    +'|\n+'+'-'*m+'+'

Приклад використання:

>>> print(kvadrat(100500))
10100250000
>>> print(kvadrat(3.1415))
9.86902225
>>> print(kvadrat('qwertyu'))
+---+
|qwe|
|rty|
|u..|
+---+

overload просто перехоплює TypeError і перекидає на наступну версію функції, не придивляючись до того, що стало причиною помилки — неправильна кількість аргументів, неприпустима операція з аргументами не того типу, явна інструкція raise і т.д. Це достатньо пітонвейно?

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

56

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

чому?

 eval('03')
Traceback (most recent call last):
  File "python", line 1, in <module>
  File "<string>", line 1
    03
     ^
SyntaxError: invalid token

при тому що :

   eval('0')
=> 0
   

57 Востаннє редагувалося P.Y. (23.09.2016 22:30:49)

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

python3: 03 - помилка.
python2: 03 - запис числа 3 в вісімковій системі. Подібний синтаксис використовується і в C та ін.

Схоже, в python3 вирішили відмовитись від цієї фічі (яка незовсім очевидна: записуючи 011, непідготований користувач очікує бачити 11, а не 9) — тим більше, вісімковий запис нині використовується не надто часто. Якщо треба записати вісімкове число, це слід вказати більш явно, префіксом 0o (напр., 0o11 замість 011) — такий варіант запису підтримується як у python2, так і в python3.

Якщо малась на увазі можливість писати зайві нулі на початку десяткових цілих чисел — просто не пишіть їх у коді. Якщо ж це обробка вводу користувача, для перетворення рядка в число можна використати не eval('03'), а int('03') — тут число вважається завжди десятковим, а початкові нулі ігноруються. Для перетворення з інших рахівних систем також можна використати int(число, основа) — наприклад, int('011', 8 ) == 9

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

58

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

P.Y. написав:

python3: 03 - помилка.
python2: 03 - запис числа 3 в вісімковій системі. Подібний синтаксис використовується і в C та ін.

Схоже, в python3 вирішили відмовитись від цієї фічі (яка незовсім очевидна: записуючи 011, непідготований користувач очікує бачити 11, а не 9) — тим більше, вісімковий запис нині використовується не надто часто. Якщо треба записати вісімкове число, це слід вказати більш явно, префіксом 0o (напр., 0o11 замість 011) — такий варіант запису підтримується як у python2, так і в python3.

Якщо малась на увазі можливість писати зайві нулі на початку десяткових цілих чисел — просто не пишіть їх у коді. Якщо ж це обробка вводу користувача, для перетворення рядка в число можна використати не eval('03'), а int('03') — тут число вважається завжди десятковим, а початкові нулі ігноруються. Для перетворення з інших рахівних систем також можна використати int(число, основа) — наприклад, int('011', 8 ) == 9

так і зробив, просто зацікавило - чому так обробляє.

import sys

with open(sys.argv[1], 'r') as test_cases:
    for test in test_cases:
        test, pt = test.strip('\n').split(' ')
        if '-' in pt:
            oi = pt.index('-')
            print(int(test[:oi]) - int(test[oi:]))
        else:
            oi = pt.index('+')
            print(int(test[:oi]) + int(test[oi:]))

ну і з eval код в моєму випадку був красивіший (хоч і повільніший):

import sys

with open(sys.argv[1], 'r') as test_cases:
    for test in test_cases:
        test, pt = test.strip('\n').split(' ')
        for i in ('-', '+'):
            if i in pt : 
                oi = pt.index(i)
                test = test[:oi] + i + test[oi:]
        print(eval(test))

задачка звідси - https://www.codeeval.com/open_challenges/131/

59

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

а з вашим пєтоном мона зробити отаке?...

написати якийсь простенький сервер, котрий міг би дозволяти грати відразу двом чи трьом людям в одну гру, і шоб він ще зберігав якісь дані, типу рекордів, в бд, і шоб оце він працював на якомусь дешевому, майже безкоштовному лінух залізі?

60

Re: Чого вам не вистачає в Пітоні? Ділимося власними костилями

FakiNyan написав:

а з вашим пєтоном мона зробити отаке?...

написати якийсь простенький сервер, котрий міг би дозволяти грати відразу двом чи трьом людям в одну гру, і шоб він ще зберігав якісь дані, типу рекордів, в бд, і шоб оце він працював на якомусь дешевому, майже безкоштовному лінух залізі?

Дозволяю, робіть.