2017-02-22 2 views
2

В следующем коде на языке python какой тип возвращает функция bruteforce_list?Какой тип данных возвращает следующий код python?

import paramiko, sys, os, socket, threading, time 
import itertools,string,crypt 

PASS_SIZE = 5 

def bruteforce_list(charset, maxlength): 
    return (''.join(candidate) 
     for candidate in itertools.chain.from_iterable(itertools.product(charset, repeat=i) 
     for i in range(1, maxlength + 1))) 

letters_list = '[email protected]#$&()' 

for i in bruteforce_list(letters_list, PASS_SIZE): 
    print i 

Я никогда не видел, чтобы циклы использовались так, как они после присоединения (кандидата) таким образом. Я очень новичок в python, и общее объяснение будет оценено.

+4

Это [выражение генератора] (https://docs.python.org/3.6/reference/expressions.html#generator-expressions). –

ответ

1

Как @Mad Физик заявил, что возвращает выражение генератора.

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

Generator выражение принимает общую форму:

(выражения для переменной в итерируемого)

Можно дополнительно включать в себя условие:

(экспрессия для переменной in iterable если условия)

Наконец, вы можете иметь несколько для статей:

(экспрессии для variable_a в iterable_a для variable_b в iterable_b)

Генератор выражение не материализуют каждый элемент одновременно; вместо этого вы можете перебирать генератор, чтобы получить элемент за раз. Это может быть эффективным, если вы хотите избежать хранения больших коллекций в памяти.

+0

Таким образом, логически это эквивалентно некоторому коду, в котором где-то появляется команда yield. Трудно обернуть голову вокруг, как новичок. – ojblass

3

В общем случае в python вы можете указать тип переменной с помощью функции type(). , попробуйте сделать что-то подобное в петле print type(i), что должно дать вам краткое представление о том, что такое i.