Форум сайта python.su
0
1) Подскажите как можно передать переменные основной программы (если их прилично много) в собственный модуль который нуждается в тех переменных ?
В модуле всего одна функция и она требует переменных из главного файла.
Как я понял можно сделать так:
function(par1, par2, par3, par4...] # что делать если параметров 15 ?
from gfx.stars import stars
import gfx.stars
stars(distanceBetweenTheStar, 10) # с ошибкой: Traceback (most recent call last): File "C:/PycharmProjects/kosmos/main.py", line 36, in <module> stars(distanceBetweenTheStar, 10)
NameError: global name 'random' is not defined
import pygame import random pygame.init() res = pygame.display.list_modes() width, height = res[0] screen = pygame.display.set_mode(([width, height]), pygame.FULLSCREEN, 32) pygame.display.toggle_fullscreen() font = pygame.font.Font(None, 50) clock = pygame.time.Clock() distanceBetweenTheStar = 1 # расстояние в пикселах между предыдущей и следующей печати звезд white = (255, 255, 255) # цвет звезд lime = (0, 255, 0) # цвет букв black = (0, 0, 0) # фоновый цвет fps = 60 # кадров в секунду allStars = [] # создаем пустой список для всех звезд # функция просчета и печати звезд на экран def stars(distanceBetweenTheStar, speed): # печатаем новые звезды с переодичность заданной в distanceBetweenTheStar if distanceBetweenTheStar == 0: sumStars = random.randint(1, 4) # получаем кол-во звезд в пределах 1-4 preparationStars = [] # создаем пустой список подготовки блока вида [[],[],[]]preparation newStars = [] # создаем пустой список получнех координат для полученых звезд # задаем координаты по Y для полученого блока звезд for i in range(0, sumStars): # в блок заносим случайную координату Y для всех звезд одного блока newStars.append(random.randint(0, height)) # добовляем полученые координаты из блока звезд в список подготовки preparation preparationStars.append(newStars) # добавляем координату X которая идентична для всех звезд всех вновь созданных блоков # и равна правому краю экрана width preparationStars.append([width]) # добавляем speedBlock = random.randint(1, speed) preparationStars.append([speedBlock]) # кидаем все в общий список звезд [координаты Y полученых звезд] [координата X] [скорость] allStars.append(preparationStars) starsCounter = 0 for block in allStars: # вытаскиваем координату звезд блока Y oldCoor = block.pop(1) # отнимаем от координаты Y скорость speed subSpeed = oldCoor[0] - block[1][0] newCoor = subSpeed # вставляем измененную координату Y обратно в блок block.insert(1, [newCoor]) if subSpeed >= 0: # печатаем звезды из изменненого блока for xCor in block[0]: # берем все координаты по Х из текущего блока pygame.draw.rect(screen, white,[newCoor, xCor, 1, 1], 1) starsCounter = starsCounter + 1 else: allStars.remove(block) starCountInScreen = font.render("Stars in screen = " + str(starsCounter), True, lime) screen.blit(starCountInScreen, (400, 400)) running = True distance = distanceBetweenTheStar while running: if distanceBetweenTheStar == 0: distanceBetweenTheStar = distance else: distanceBetweenTheStar = distanceBetweenTheStar - 1 screen.fill(black) stars(distanceBetweenTheStar, 10) pygame.display.flip() clock.tick(fps) for event in pygame.event.get(): if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: running = False pygame.quit()
Отредактировано vito-Z80 (Апрель 2, 2016 22:44:07)
Офлайн
253
1 когда переменных много смотрят в сторону ООП. те группируют переменные в классах.
2
vito-Z80Вообще не знаю слова directiry. Дайте ссылку что это.
directiry от Python package ?
vito-Z80Так вы свой модуль приведите. Перед этим упростите его чтобы осталось только то что вызывает ошибку.
импортируя random из собственного модуля
vito-Z80Функция никогда не может стать модулем. Вы можете вынести функцию в модуль и импортировать оттуда
из которой функцию stars я хочу сделать импортируемым модулем
vito-Z80Сделайте еще модуль с этими переменными и импортируйте его в main и в stars
модулем в папке эти переменные уже не видны.
Офлайн
0
doza_and
1 когда переменных много смотрят в сторону ООП. те группируют переменные в классах.2
import dir.stars #или from dir.stars import stars stars(distanceBetweenTheStar, 10) # или stars.stars(distanceBetweenTheStar, 10)
Сделайте еще модуль с этими переменными и импортируйте его в main и в starsтут я вообще потерялся
import pygame from gfx.stars import stars pygame.init() res = pygame.display.list_modes() width, height = res[0] screen = pygame.display.set_mode(([width, height]), pygame.FULLSCREEN, 32) pygame.display.toggle_fullscreen() font = pygame.font.Font(None, 50) clock = pygame.time.Clock() distanceBetweenTheStar = 1 # расстояние в пикселах между предыдущей и следующей печати звезд distance = distanceBetweenTheStar white = (255, 255, 255) # цвет звезд lime = (0, 255, 0) # цвет букв black = (0, 0, 0) # фоновый цвет fps = 60 # кадров в секунду allStars = [] # создаем пустой список для всех звезд running = True while running: if distanceBetweenTheStar == 0: distanceBetweenTheStar = distance else: distanceBetweenTheStar = distanceBetweenTheStar - 1 screen.fill(black) stars(distanceBetweenTheStar, 10,width, height, allStars, screen, font, white, lime) pygame.display.flip() clock.tick(fps) for event in pygame.event.get(): if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: running = False pygame.quit()
import random import pygame def stars(distanceBetweenTheStar, speed,width, height, allStars, screen, font, white, lime): # печатаем новые звезды с переодичность заданной в distanceBetweenTheStar if distanceBetweenTheStar == 0: sumStars = random.randint(1, 4) # получаем кол-во звезд в пределах 1-4 preparationStars = [] # создаем пустой список подготовки блока вида [[],[],[]]preparation newStars = [] # создаем пустой список получнех координат для полученых звезд # задаем координаты по Y для полученого блока звезд for i in range(0, sumStars): # в блок заносим случайную координату Y для всех звезд одного блока newStars.append(random.randint(0, height)) # добовляем полученые координаты из блока звезд в список подготовки preparation preparationStars.append(newStars) # добавляем координату X которая идентична для всех звезд всех вновь созданных блоков # и равна правому краю экрана width preparationStars.append([width]) # добавляем speedBlock = random.randint(1, speed) preparationStars.append([speedBlock]) # кидаем все в общий список звезд [координаты Y полученых звезд] [координата X] [скорость] allStars.append(preparationStars) starsCounter = 0 for block in allStars: # вытаскиваем координату звезд блока Y oldCoor = block.pop(1) # отнимаем от координаты Y скорость speed subSpeed = oldCoor[0] - block[1][0] newCoor = subSpeed # вставляем измененную координату Y обратно в блок block.insert(1, [newCoor]) if subSpeed >= 0: # печатаем звезды из изменненого блока for xCor in block[0]: # берем все координаты по Х из текущего блока pygame.draw.rect(screen, white,[newCoor, xCor, 1, 1], 1) starsCounter = starsCounter + 1 else: allStars.remove(block) starCountInScreen = font.render("Stars in screen = " + str(starsCounter), True, lime) screen.blit(starCountInScreen, (400, 400))
def stars(distanceBetweenTheStar, speed,width, height, allStars, screen, font, white, lime):
import random import pygame
stars(distanceBetweenTheStar, 10,width, height, allStars, screen, font, white, lime, random, pygame)
Отредактировано vito-Z80 (Апрель 3, 2016 00:35:14)
Офлайн
253
vito-Z80Модуль это модуль, функция это функция, а класс это класс. И никаким образом одно другим не станет.
а класс можно сделать модулем с функцией как я понял и принимать глобальные переменные ?
vito-Z80Надо было привести как выдирали, что вы сейчас и сделали.
из которого я хочу выдрать функцию в отдельный файл
vito-Z80Вы не освоились с терминологией сами путаетесь и всех путаете. Модуль нельзя вызвать. Вызвать можно функцию.
так еще и при каждом вызове модуля:
vito-Z80
мне приходится импортировать:
vito-Z80Похоже Вы не понимаете разницу между модулем и функцией. Модуль это файл. Он выполняется Питоном при импорте не более одного раза. Функций может быть много в файле. Это куски кода которые вы по своему желанию выполняете сколько угодно раз. Поэтому никакого многократного импорта не будет. Его в принципе не бывает в питоне.
а это я так понимаю ни есть хорошо, падает производительность.
vito-Z80Все это очень плохо. Прочитайте книжку вместо того чтобы делать программы методом тыка.
но опять же не знаю, хорошо это или плохо ?
Отредактировано doza_and (Апрель 3, 2016 09:43:06)
Офлайн
0
doza_andЯ что то вообще запутался…
Модуль нельзя вызвать. Вызвать можно функцию.Честно сказать я путаюсь от подобного - если файл выполняется, в котором функция, разве это не считается его вызовом/выполнением/исполнением ?
Модуль это файл. Он выполняется Питоном при импорте не более одного раза.
Это куски кода которые вы по своему желанию выполняете сколько угодно раз. Поэтому никакого многократного импорта не будет. Его в принципе не бывает в питоне.
модуль выполняется питоном 1 разА глобальные аргументы вынесите в отдельный, третий модуль, как я вам уже советовал.то есть скажем создать в папке glob файл glob.py и в него засунуть глобальные переменные, что бы импортировать его в main.py & gfx/stars.py, я правильно понял ?
Отредактировано vito-Z80 (Апрель 3, 2016 10:46:46)
Офлайн
253
vito-Z80Не нужна папка. Просто файл создайте “my_global_vars.py” рядом с вашими main.py и прочим.
то есть скажем создать в папке glob файл glob.py
from my_global_vars import * # дурной стиль но соответствует вашим целям.
vito-Z80Когда питон видит определение функции (при импорте или если вы в интерактивной консоли набрали определение) он запоминает что она есть, но не выполняет ее. Как он ее выполнит? У него ведь аргументов передаваемых в функцию нет.
если файл выполняется, в котором функция,
vito-Z80
разве это не считается его вызовом/выполнением/исполнением ?
python you_module.py
import subprocess as sp sp.check_call("python you_module.py",shell=1)
import you_module
vito-Z80А я не догоняю что вы имеете ввиду. Тут с логикой чтото.
я реально не догоняю
почему не будет многократного вызова, если модуль (это подгружаемый файл) выполняется питоном 1 раз ?
Офлайн