Вы можете написать собственную функцию для работы со строками:
get.nameofpage = function(string){
(unlist(strsplit(string, "\\/")))[4]
}
# Example
my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
> get.nameofpage(my.string)
[1] "nameofpage"
Самая близкая параллель должна, вероятно, присоединить значения к самой функции.
def foo():
foo.bar = foo.bar + 1
foo.bar = 0
foo()
foo()
foo()
print foo.bar # prints 3
Python имеет генераторы, которые делают что-то подобное:
Класс может быть лучшим соответствием здесь (и обычно лучшее пригодное для чего-либо включающего "состояние"):
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()
Не уверенный, если это - то, что Вы ищете, но 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?
Вот один способ реализовать закрытие в 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.
Не то, чтобы я рекомендую это, но только для забавы:
def foo(var=[1]):
print var[0]
var[0] += 1
Это работает из-за способа, которым изменяемые параметры по умолчанию работают в Python.
Да, хотя необходимо объявить глобальную переменную сначала, прежде чем в ней встретятся 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
.
Вы могли также использовать что-то как
def static_num2():
k = 0
while True:
k += 1
yield k
static = static_num2().next
for i in range(0,10) :
print static()
избегать глобального var. Снятый с этой ссылки о том же вопросе.
Предпочтительный путь состоит в том, чтобы использовать класс или генератор (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
>>> def foo():
x = 1
while True:
yield x
x += 1
>>> z = iter(foo())
>>> next(z)
1
>>> next(z)
2
>>> next(z)
3
Вот другой грязный дешевый способ сделать это, это - вариация на ответ 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
>>>
"""