Распространенные ошибки в Python [дубликат]

это просто, например, если у вас есть этот объект массива:

 cars = ["Dodge", "Fiat", "Audi", "Volvo", "BMW", "Ford"];

и вы хотите, чтобы объект был отсортирован во фронте HTML, используйте:

 <li ng-repeat="x in cars | orderBy">{{x}}</li>

По умолчанию строки отсортированы в алфавитном порядке, а числа отсортированы по номерам.

Если у вас есть этот массив с ключами:

customers = [
{"name" : "Bottom-Dollar Marketse" ,"city" : "Tsawassen"},
{"name" : "Alfreds Futterkiste", "city" : "Berlin"},
{"name" : "Bon app", "city" : "Marseille"},
{"name" : "Cactus Comidas para llevar", "city" : "Buenos Aires"},
{"name" : "Bolido Comidas preparadas", "city" : "Madrid"},
{"name" : "Around the Horn", "city" : "London"},
{"name" : "B's Beverages", "city" : "London"}
];

Использование:

Сортировать массив по «городскому» порядку DESC:

<li ng-repeat="x in customers | orderBy : '-city'">{{x.name + ", " + x.city}}</li>

Сортировать массив по "городу":

<li ng-repeat="x in customers | orderBy : 'city'">{{x.name + ", " + x.city}}</li>
75
задан 20 revs, 9 users 32% 23 May 2017 в 10:30
поделиться

34 ответа

Similar to mutable default arguments is the mutable class attribute.

>>> class Classy:
...    foo = []
...    def add(self, value):
...        self.foo.append(value)
... 
>>> instance1 = Classy()
>>> instance2 = Classy()
>>> instance1.add("Foo!")
>>> instance2.foo
['Foo!']

Not what you expect.

0
ответ дан 24 November 2019 в 11:24
поделиться

Об этом уже упоминалось, но я хотел бы подробнее остановиться на изменчивости атрибутов класса.

Когда вы определяете атрибут-член, а затем каждый раз, когда вы создаете экземпляр этого класса, он получает атрибут, который является неглубокой копией атрибута класса.

Итак, если у вас есть что-то вроде

class Test(object):
   myAttr = 1
instA = Test()
instB = Test()
instB.myAttr = 2

, он будет вести себя так, как ожидалось.

>>> instA.myAttr
  1
>>> instB.myAttr
  2

Проблема возникает когда у вас есть изменяемые атрибуты класса. Поскольку при создании экземпляра была выполнена неглубокая копия, все экземпляры будут просто иметь ссылку, указывающую на один и тот же объект.

class Test(object):
   myAttr=[1,2,3]
instA = Test()
instB = Test()
instB.myAttr[0]=2
>>> instA.myAttr
   [2,2,3]

Но ссылки являются фактическими членами экземпляра, если вы фактически назначаете что-то новое в атрибуте вы в порядке.

0
ответ дан 24 November 2019 в 11:24
поделиться

В блогах об алгоритмах есть хорошая статья о проблемах с производительностью Python и о том, как их избежать: 10 советов и проблем по оптимизации Python

0
ответ дан 24 November 2019 в 11:24
поделиться

Атрибуты класса

Некоторые ответы выше неверны или неясны относительно атрибутов класса.

Они не становятся атрибутами экземпляра, но могут считываться с использованием того же синтаксиса, что и атрибуты экземпляра. Их можно изменить, обратившись к ним через имя класса.

class MyClass:
    attrib = 1                         # class attributes named 'attrib'
    another = 2                        # and 'another'
    def __init__(self):
        self.instattr = 3              # creates instance attributes
        self.attrib = 'instance'      

mc0 = MyClass()
mc1 = MyClass()

print mc.attrib    # 'instance'
print mc.another   # '2'

MyClass.another = 5  # change class attributes
MyClass.attrib = 21  # <- masked by instance attribute of same name

print mc.attrib    # 'instance'   unchanged instance attribute
print mc.another   # '5'          changed class attribute

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

Локальные переменные промежуточной области видимости

Более сложный вопрос для понимания - это область видимости переменных во вложенных функциях.

В следующем примере y не может быть записан из любого места, кроме функции 'external'. x доступен для чтения и записи из любого места, поскольку он объявлен глобальным в каждой функции. z доступен для чтения и записи только во внутреннем *. y читается во "внешнем" и "внутреннем *", но не доступен для записи, кроме "external".

x = 1
def outer():
    global x
    y = 2
    def inner1():
        global x, y
        y = y+1  # creates new global variable with value=3
    def inner2():
        global x
        y = y+1  # creates new local variable with value=3

Я считаю, что Python 3 включает ключевое слово external для таких случаев, которые «вне этой функции, но не глобальные». В Python 2.# вы застряли в том, чтобы либо сделать y глобальным, либо сделать его изменяемым параметром для 'inner'.

0
ответ дан 24 November 2019 в 11:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: