Если я принимаю пользовательское значение в качестве параметра функции, как мне сделать его глобальной переменной? - PullRequest
0 голосов
/ 06 июня 2019

Я пишу программу, которая может перемешать перемешать заданную последовательность (список 1), м раз.Моя функция принимает в качестве входных данных список l и число m, но я определил сам shuffle для одного shuffle, а затем использовал цикл for, чтобы сделать это m раз.Однако теперь цикл for не принимает назначенное пользователем значение m.

Я нуб из Python, поэтому, скорее всего, я упускаю простую вещь.Я пытался использовать глобальный m, чтобы (пере) определить m в моей функции, но либо я не знаю, как это сделать, либо он не работает.

def riffle_shuffle(l, global m):
    #global m goes here?
    r = np.random.binomial(len(l),0.5)
    sd1 = l[:r]
    d2 = l[r:]
    fl = []
    c = [sd2,sd1]
    l2 = sd2+sd1
    for i in range(1,len(l) + 1):
        x = [sd2,sd1]
        y = [(len(sd2))/(len(l) - i+1),(len(sd1))/(len(l) - i+1)] 
        a = choices(x,y)
        a1 = a[0][0]
        fl.append(a1)
        #Deck Split is c
        #Sub decks are',c
        #Probabilities are',y
        #Deck chosen is',a
        #fl
        if a1 in sd1:
            sd1.remove(a1)
        elif a1 in sd2:
            sd2.remove(a1)        
return fl,m       

for j in range(1,m+1):
  fl = riffle_shuffle(fl)

return fl

Я получил ошибки, в которых говорится, что m не определен, неверный синтаксис, следующее сообщение об ошибке.Я не знаю, что означает этот последний.

'максимальная глубина рекурсии превышена в сравнении'

Любая помощь очень ценится, спасибо!

РЕДАКТИРОВАТЬ: я пропустил цикл for, который я упомянул в описании.Это сейчас извините.

1 Ответ

0 голосов
/ 06 июня 2019

Итак ... Вам нужен метод, который делает случайное перемешивание m раз, верно?

Есть некоторые проблемы с вашим кодом:

Во-первых, return находится вне функции.

Во-вторых, вы вызываете свою функцию в своей функции, не нарушая условия: функция будет вызывать функцию, которая будет вызывать функцию снова и снова, и так далее, пока не произойдет ошибка.Это maximum recursion depth exceeded in comparison.

В-третьих, вы должны использовать np.random.choice, например: np.random.choice(x, p=y).В противном случае python не знает, что y является вероятностью, и он будет интерпретировать его как второй аргумент: размер вывода.Таким образом, здесь происходит ошибка.

Это может быть код, который вы хотите написать:

import numpy as np

def riffle_shuffle(l, m):
    if m == 0:
        return l
    else:
        fl = []
        r = np.random.binomial(len(l), 0.5)
        sd1 = l[:r]
        sd2 = l[r:]
        c = [sd2,sd1]
        l2 = sd2+sd1
        for i in range(1,len(l) + 1):
            x = [sd2,sd1]
            y = [(len(sd2))/(len(l) - i+1), (len(sd1))/(len(l) - i+1)] 
            a = np.random.choice(2, p=y)
            a = x[a]
            a1 = a[0]
            fl.append(a1)
            #Deck Split is c
            #Sub decks are',c
            #Probabilities are',y
            #Deck chosen is',a
            #fl

            if a1 in sd1:
                sd1.remove(a1)
            elif a1 in sd2:
                sd2.remove(a1) 
        fl = riffle_shuffle(fl, m - 1)

        return fl


a = riffle_shuffle([1, 2, 3, 4, 5, 6, 7, 8], 3)
print(a)
#output : [5, 6, 1, 7, 4, 8, 2, 3] (can be changed)

Как и вы, я вызвал функцию 'recursively' - вызов функции внутри функции - с условием прерывания.

Таким образом, вам не нужно использовать глобальную переменную - в большинстве случаев использование глобальной переменной не очень хорошая идея.

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

a = 0
def foo(m):
    global a
    a = m
    #and your code here...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...