У меня странная проблема, которую я хотел бы понять. Я написал простой генетический код, позволяющий угадать пару букв «ab». Существует цикл, в котором в качестве первого шага используется функция, генерирующая случайных кандидатов. Функция работает и ее легко понять, но она не работает при импорте, только в том случае, если она находится внутри всего модуля генетического кода. Если я напишу другой модуль только с этой функцией и импортирую оттуда, он будет работать нормально.
Что это за черт?
Это код, который я использую для импорта функции:
from scratch_2 import generate_random_candidate
print (generate_random_candidate())
Это Scratch_2:
import random
import string
target = "ab"
letras = string.ascii_lowercase
tried_candidates = set()
def generate_random_candidate():
while True:
intento = random.choice(letras) + random.choice(letras)
if intento not in tried_candidates:
tried_candidates.add(intento)
return intento
Так вот что работает совершенно нормально. А это Scratch_1, когда я импортирую оттуда, я вижу, что функция отладки не работает, если я печатаю try_candidates, я вижу, что она печатает set(), set(), set(), как будто это внутри бесконечного цикла. Это потому, что он вызывает функцию, но не запускает ее код? Связано ли это с переменной try_candidates. Разве одна и та же функция не должна работать независимо от того, в каком модуле она хранится?
Это Scratch_1, если я импортирую функцию из него, она ничего не делает.
import random
import string
import matplotlib.pyplot as plt
import plotly.graph_objects as go
target = "ab"
letras = string.ascii_lowercase
tried_candidates = set()
def generate_random_candidate():
while True:
intento = random.choice(letras) + random.choice(letras)
if intento not in tried_candidates:
tried_candidates.add(intento)
return intento
def generate_children(parent):
hijos = []
while True:
intento = parent[0] + random.choice(letras)
if intento not in tried_candidates:
hijos.append(intento)
break
while True:
intento = random.choice(letras) + parent[1]
if intento not in tried_candidates:
hijos.append(intento)
break
return hijos
def evaluate_candidate(candidate):
score = 0
if candidate[0] == target[0]:
score += 1
if candidate[1] == target[1]:
score += 1
"""
if candidate[0] == target[1]:
score += 0.1
if candidate[1] == target[0]:
score += 0.1
"""
return score
def g ():
tried_candidates = set()
population_size = 10
population = []
for _ in range(population_size):
population.append(generate_random_candidate())
contador = 1
while True:
tried_candidates.update(population)
scores = []
for candidate in population:
scores.append(evaluate_candidate(candidate))
children = []
Flag = False
for i, score in enumerate(scores):
if score == 2:
Flag = True
break
if score == 1 :
x = generate_children(population)
tried_candidates.update(x)
children.extend(generate_children(population))
if len(children) < population_size:
new_candidates = []
for _ in range(population_size - len(children)):
y = generate_random_candidate()
tried_candidates.update(y)
new_candidates.append(y)
children.extend(new_candidates)
population = children
else:
meter = children[population_size:]
population = children[:population_size]
tried_candidates.difference_update(meter)
found = False
for candidate in population:
if evaluate_candidate(candidate) == 2 or Flag == True:
found = True
return contador
contador = contador +1
resultados = []
for i in range (100000):
resultados.append(g())
Подробнее здесь: https://stackoverflow.com/questions/791 ... hen-import
Импортированная функция Python работает при импорте из модуля 1, но не работает при импорте из модуля 2. ⇐ Python
Программы на Python
1730798601
Anonymous
У меня странная проблема, которую я хотел бы понять. Я написал простой генетический код, позволяющий угадать пару букв «ab». Существует цикл, в котором в качестве первого шага используется функция, генерирующая случайных кандидатов. Функция работает и ее легко понять, но она не работает при импорте, только в том случае, если она находится внутри всего модуля генетического кода. Если я напишу другой модуль только с этой функцией и импортирую оттуда, он будет работать нормально.
Что это за черт?
Это код, который я использую для импорта функции:
from scratch_2 import generate_random_candidate
print (generate_random_candidate())
Это Scratch_2:
import random
import string
target = "ab"
letras = string.ascii_lowercase
tried_candidates = set()
def generate_random_candidate():
while True:
intento = random.choice(letras) + random.choice(letras)
if intento not in tried_candidates:
tried_candidates.add(intento)
return intento
Так вот что работает совершенно нормально. А это Scratch_1, когда я импортирую оттуда, я вижу, что функция отладки не работает, если я печатаю try_candidates, я вижу, что она печатает set(), set(), set(), как будто это внутри бесконечного цикла. Это потому, что он вызывает функцию, но не запускает ее код? Связано ли это с переменной try_candidates. Разве одна и та же функция не должна работать независимо от того, в каком модуле она хранится?
Это Scratch_1, если я импортирую функцию из него, она ничего не делает.
import random
import string
import matplotlib.pyplot as plt
import plotly.graph_objects as go
target = "ab"
letras = string.ascii_lowercase
tried_candidates = set()
def generate_random_candidate():
while True:
intento = random.choice(letras) + random.choice(letras)
if intento not in tried_candidates:
tried_candidates.add(intento)
return intento
def generate_children(parent):
hijos = []
while True:
intento = parent[0] + random.choice(letras)
if intento not in tried_candidates:
hijos.append(intento)
break
while True:
intento = random.choice(letras) + parent[1]
if intento not in tried_candidates:
hijos.append(intento)
break
return hijos
def evaluate_candidate(candidate):
score = 0
if candidate[0] == target[0]:
score += 1
if candidate[1] == target[1]:
score += 1
"""
if candidate[0] == target[1]:
score += 0.1
if candidate[1] == target[0]:
score += 0.1
"""
return score
def g ():
tried_candidates = set()
population_size = 10
population = []
for _ in range(population_size):
population.append(generate_random_candidate())
contador = 1
while True:
tried_candidates.update(population)
scores = []
for candidate in population:
scores.append(evaluate_candidate(candidate))
children = []
Flag = False
for i, score in enumerate(scores):
if score == 2:
Flag = True
break
if score == 1 :
x = generate_children(population[i])
tried_candidates.update(x)
children.extend(generate_children(population[i]))
if len(children) < population_size:
new_candidates = []
for _ in range(population_size - len(children)):
y = generate_random_candidate()
tried_candidates.update(y)
new_candidates.append(y)
children.extend(new_candidates)
population = children
else:
meter = children[population_size:]
population = children[:population_size]
tried_candidates.difference_update(meter)
found = False
for candidate in population:
if evaluate_candidate(candidate) == 2 or Flag == True:
found = True
return contador
contador = contador +1
resultados = []
for i in range (100000):
resultados.append(g())
Подробнее здесь: [url]https://stackoverflow.com/questions/79150624/imported-python-function-works-when-imported-from-module-1-but-fails-when-import[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия