Python имеет что-то как Perl 5.10's переменные “состояния”?

Вы можете написать собственную функцию для работы со строками:

get.nameofpage = function(string){
  (unlist(strsplit(string, "\\/")))[4]
}

# Example
my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
> get.nameofpage(my.string)
[1] "nameofpage"
8
задан mike 3 March 2009 в 00:17
поделиться

11 ответов

Самая близкая параллель должна, вероятно, присоединить значения к самой функции.

def foo():
    foo.bar = foo.bar + 1

foo.bar = 0

foo()
foo()
foo()

print foo.bar # prints 3
12
ответ дан 5 December 2019 в 04:30
поделиться

Python имеет генераторы, которые делают что-то подобное:

Что ключевое слово "урожая" делает в Python?

9
ответ дан 5 December 2019 в 04:30
поделиться

Класс может быть лучшим соответствием здесь (и обычно лучшее пригодное для чего-либо включающего "состояние"):

class Stateful(object):

    def __init__(self):
        self.state_var = 0

    def __call__(self):
        self.state_var = self.state_var + 1
        print self.state_var

foo = Stateful()
foo()
foo()
17
ответ дан 5 December 2019 в 04:30
поделиться

Не уверенный, если это - то, что Вы ищете, но Python имеет функции генератора, которые не возвращают значение по сути, но объект генератора, который генерирует новое значение каждый раз

def gen():
   x = 10
   while True:
      yield x
      x += 1

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

>>> a = gen()
>>> a.next()
10
>>> a.next()
11
>>> a.next()
12
>>> a.next()
13
>>> 

здесь ищите больше объяснения на урожае:
Что ключевое слово "урожая" делает в Python?

8
ответ дан 5 December 2019 в 04:30
поделиться

Вот один способ реализовать закрытие в Python:

def outer():
    a = [4]
    def inner():
        print a[0]
        a[0] = a[0] + 1
    return inner

fn = outer()
fn() # => 4
fn() # => 5
fn() # => 6

Я заимствовал этот пример дословно из сообщения списка рассылки Python.

5
ответ дан 5 December 2019 в 04:30
поделиться

Не то, чтобы я рекомендую это, но только для забавы:

def foo(var=[1]):
    print var[0]
    var[0] += 1

Это работает из-за способа, которым изменяемые параметры по умолчанию работают в Python.

2
ответ дан 5 December 2019 в 04:30
поделиться

Да, хотя необходимо объявить глобальную переменную сначала, прежде чем в ней встретятся foo:

x = 0

def foo():
    global x
    x += 1
    print x

foo()
foo()
foo()

Править: В ответ на комментарий это верно, что Python не имеет никаких статических переменных, ограниченных по объему в функции. Отметьте это x в этом примере только выставляется как глобальный остальной части модуля. Например, скажите, что код выше находится в test.py. Теперь предположите запись следующего модуля:

from test import foo
x = 100
foo()
foo()

Вывод будет только 1 и 2, нет 101 и 102.

2
ответ дан 5 December 2019 в 04:30
поделиться

Вы могли также использовать что-то как

def static_num2():
    k = 0
    while True:
        k += 1
        yield k

static = static_num2().next

for i in range(0,10) :
    print static()

избегать глобального var. Снятый с этой ссылки о том же вопросе.

2
ответ дан 5 December 2019 в 04:30
поделиться

Предпочтительный путь состоит в том, чтобы использовать класс или генератор (yield).

Ради полноты вот является вариант w/закрытием в Python 3.x:

>>> def make_foo():
...     x = 1
...     def foo():
...         nonlocal x
...         print(x)
...         x += 1
...     return foo
...
>>> foo = make_foo()
>>> foo()
1
>>> foo()
2
>>> foo()
3
2
ответ дан 5 December 2019 в 04:30
поделиться
>>> def foo():
    x = 1
    while True:
        yield x
        x += 1


>>> z = iter(foo())
>>> next(z)
1
>>> next(z)
2
>>> next(z)
3
1
ответ дан 5 December 2019 в 04:30
поделиться

Вот другой грязный дешевый способ сделать это, это - вариация на ответ Tryiptich, но декораторы использования

def static_var( name, value ):
    def dec( function ):
        setattr( function, name, value )
        return function
    return dec


@static_var( 'counter', 0 )
def counting_function():
    counting_function.counter = counting_function.counter + 1
    print counting_function.counter



"""
>>> counting_function()
1
>>> counting_function()
2
>>> counting_function()
3
>>> counting_function()
4
>>> counting_function()
5
>>> 
"""    
0
ответ дан 5 December 2019 в 04:30
поделиться