61

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

koala написав:
FakiNyan написав:

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

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

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

та я не дозволу питаю, а чи взагалі є можливість таке зробити, і наскільки то складно

62

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

Є. Не складніше, ніж з іншими мовами.
Щоправда, Python відомий своєю... зниженою ефективністю. Але в грі на трьох людей це не суттєво (якщо ви не влаштовуєте там бурхливу графіку по мережі).

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

63

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

ОК, тобто майже єдиним недоліком Python є його швидкодія, що є наслідком того що вона є інтерпретованою мовою. Можливо якось виправити? Чи краще щоб далі займала свою нішу?

64

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

Q-bart написав:

ОК, тобто майже єдиним недоліком Python є його швидкодія, що є наслідком того що вона є інтерпретованою мовою. Можливо якось виправити? Чи краще щоб далі займала свою нішу?

Не зовсім так. Інтерпретованість Пітона є наслідком його лаконічності - деякі складні речі коротше робити в інтерпретованій мові. Python - мова лаконічна.
Коли вам потрібні в C++ прості числа до 100, ви стикаєтеся з кількома питаннями, на кшталт:
- чи треба економити пам'ять?
- чи треба серед них швидко шукати?
- чи треба буде в подальшому збільшувати кількість елементів?
і т.д. - і відповідно до цього, ви обираєте, як їх зберігати: char [], unsigned * в купі, vector<int>, map<int, int>, valarray<long long> і ще стоп'ятсот комбінацій. В Python замість всього цього - один тип: список. Зате, оскільки ви всього цього не вказуєте, ви можете зосередитися на тому, ЩО робить програма, а не ЯК.

Подякували: Q-bart, FakiNyan, leofun013

65

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

FakiNyan написав:

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

Є такий пітоновський фреймворк cherrypy - http://cherrypy.org/ Сервер з ним пишеться "легко та невимушено" куди простіше я вже й не знаю. По роботі як раз пишу на пітоні проксі-сервер використовуючи cherrypy. Враження тільки позитивні :)

Подякували: 0x9111A, FakiNyan, P.Y., leofun014

66

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

Arete написав:
FakiNyan написав:

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

Є такий пітоновський фреймворк cherrypy - http://cherrypy.org/ Сервер з ним пишеться "легко та невимушено" куди простіше я вже й не знаю. По роботі як раз пишу на пітоні проксі-сервер використовуючи cherrypy. Враження тільки позитивні :)

так це ж web фреймворк, а мені тре постійне з'єднання, типу tcp

67

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

https://docs.python.org/3/howto/sockets.html

Подякували: FakiNyan, leofun012

68

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

>>> x = ["a","b","c"]
>>> y = [x] * 4
>>> y
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> y[0][0] = "p"
>>> y
[['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c']]
>>> 

чому - то зрозуміло, але навіщо?
маючи список доведеться пам’ятати  як він створений, або довго ловити помилки
в чому тут такий "+" що це перекриває?

69 Востаннє редагувалося koala (30.10.2016 10:25:13)

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

Компроміс. Інакше довелося б копіювати списки в будь-якій ситуації - або створювати окремий оператор посилання.
Зрештою,

[x[:] for _ in range(4)]

не надто важка конструкція, як на мене, хоча, звісно, і не *.

70 Востаннє редагувалося ping (30.10.2016 10:39:09)

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

koala написав:

Компроміс. Інакше довелося б копіювати списки в будь-якій ситуації - або створювати окремий оператор посилання.
Зрештою,

[x[:] for _ in range(4)]

не надто важка конструкція, як на мене, хоча, звісно, і не *.

або

[x[:] * 4]

71 Востаннє редагувалося koala (30.10.2016 10:49:07)

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

Не те:

>>> y = [x[:] * 4]
>>> y
[['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']]

Може, ви так хотіли?

>>> y = [x[:]] * 4
>>> y
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> y[0][0]='p'
>>> y
[['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c']]
>>> 

Майже те саме, що в першому випадку. Різниця в тому, що x тут не змінюється.

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

72 Востаннє редагувалося ping (30.10.2016 10:59:52)

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

koala написав:

Не те:

Прихований текст
>>> y = [x[:] * 4]
>>> y
[['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']]

Може, ви так хотіли?

>>> y = [x[:]] * 4
>>> y
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> y[0][0]='p'
>>> y
[['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c']]
>>> 

Майже те саме, що в першому випадку. Різниця в тому, що x тут не змінюється.

і
якщо

 [x[:] for _ in range(4)]

то кожен раз генерується новий список
якшо

 [x[:]] * 4

, то список один і мультиплікується з лінками на нього.
вірно?

73

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

Так. Це легше з проміжними змінними зрозуміти:

#розкриваємо [x[:] for _ in range(4)]
res = []
for _ in range(4):
    res.append(x[:]) #тут 4 рази робиться копія

#розкриваємо [x[:]] * 4
temp = x[:]
[temp]*4 #один temp копіюється 4 рази
Подякували: ping1

74 Востаннє редагувалося ping (30.10.2016 11:56:28)

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

не годиться

>>> x=[1,[2,3]]
>>> y=[x[:] for _ in range(4)]
>>> y
[[1, [2, 3]], [1, [2, 3]], [1, [2, 3]], [1, [2, 3]]]
>>> y[1][1][1]
3
>>> y[1][1][1] = 33
>>> y
[[1, [2, 33]], [1, [2, 33]], [1, [2, 33]], [1, [2, 33]]]

deepcopy()  ?

>>> from copy import deepcopy
>>>
>>> y=[deepcopy(x[:]) for _ in range(4)]
>>> y
[[1, [2, 33]], [1, [2, 33]], [1, [2, 33]], [1, [2, 33]]]
>>> y[1][1][1] = 55
>>> y
[[1, [2, 33]], [1, [2, 55]], [1, [2, 33]], [1, [2, 33]]]
>>> 

75 Востаннє редагувалося koala (30.10.2016 12:42:54)

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

Що саме "не годиться"? Ми розбирали конкретний приклад, без вкладень глибокого рівня. Звісно, для глибокого копіювання потрібне deepcopy.

Але тепер я вже чогось не розумію.

>>> from copy import deepcopy
>>> x = ["a","b","c"]
>>> y=deepcopy([x]*4)
>>> y
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> y[0][0] = 'p'
>>> y
[['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c']]
>>> x
['a', 'b', 'c']

Чому deepcopy копіює посилання, а не вміст, якщо вони однакові? Він же, я так розумію, має копіювати все рекурсивно - а отже, має замінювати посилання на x на посилання на нову структуру 4 рази.

76

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

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

Що саме "не годиться"? Ми розбирали конкретний приклад, без вкладень глибокого рівня. Звісно, для глибокого копіювання потрібне deepcopy.

Але тепер я вже чогось не розумію.

>>> from copy import deepcopy
>>> x = ["a","b","c"]
>>> y=deepcopy([x]*4)
>>> y
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
>>> y[0][0] = 'p'
>>> y
[['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c'], ['p', 'b', 'c']]
>>> x
['a', 'b', 'c']

Чому deepcopy копіює посилання, а не вміст, якщо вони однакові? Він же, я так розумію, має копіювати все рекурсивно - а отже, має замінювати посилання на x на посилання на нову структуру 4 рази.

може так:
deepcopy не модифікує обєкт -  не розриває існуючі лінки.
він не створює нові.

77

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

Все, знайшов:
https://docs.python.org/2/library/copy.html

The deepcopy() function avoids these problems by:
keeping a “memo” dictionary of objects already copied during the current copying pass;

Deepcopy зберігає словник того, що вже скопіювалося, щоб не піти в нескінчений цикл через рекурсію.

78 Востаннє редагувалося P.Y. (30.10.2016 15:47:47)

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

Ще є ось такий нецивілізований спосіб розплутати багатовимірний масив з повторними посиланнями:
[code=python]
>>> a=[[[0]*3]*3]*3
>>> b=eval(repr(a))
>>> a
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> b
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> a[1][1][1]=1
>>> b[1][1][1]=1
>>> a
[[[0, 1, 0], [0, 1, 0], [0, 1, 0]],
[[0, 1, 0], [0, 1, 0], [0, 1, 0]],
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]]
>>> b
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]],
[[0, 0, 0], [0, 1, 0], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
[/code]
Зрозуміло, такий метод годиться лише для масивів таких типів, де repr генерує валідний вираз (числа, рядки і т.п.).

79

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

...і не рекурсивних, бо отримаєте Ellipsis.

80

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

Python не вміє літерали для циркулярних списків :(
Втім, щось подібне я бачив лише в деяких реалізаціях Scheme.

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