2013-11-17 5 views
3

Будьте предупреждены, я только начал изучать Python и его первый раз на этом сайте. Если я буду действовать как n00b, пожалуйста, не ненавидите.Почему эта функция не возвращает значение?

Итак, я создал программу, которая должна рассказать вам, сколько времени вам потребуется, чтобы добраться до звезды (расстояние указано) со скоростью света и факторами скорости света. Он начинается с библиотеки под названием easygui, которая создает красивое окно, которое пользователь выбирает. Выбранный им фактор становится переменным «выбором». Этот раздел кода работает отлично. В идеале это значение затем будет передаваться в функцию, которая будет делать факторинг, и вернуть значение для количества дней поездки. Это не увенчалось успехом. Скорее всего, я просто поставил это неправильно, поэтому, если кто-то знает правильный способ использования функций, я бы очень признателен за вашу помощь! О, и я попытался прокомментировать, как сумасшедший, так что, надеюсь, все имеет смысл!

import easygui as eg    #the gui creation library I am using 

dist = 41000000000000   #distance to the star 
light = 300000     #speed of light 


def Convert (factor):   #takes in factor chosen by user 
    speed = light*factor  #the speed is the factor multiplied by the speed of light 
    time = (dist/speed)/3600 # the time is the distance/divided by the speed, since thats a huge value in seconds, the /3600 should reduce it to days 
    return time     #"should" return the value it got for "time" 


msg  = "Choose a warp factor:"     #creates a gui window for user to select factor 
title = "Warp Factor Selection" 
choices = ["1", "3", "5", "10", "50", "100", "200", "500", "1000"] 
choice = eg.buttonbox(msg, title, choices)  #gui returns the user's selection as "choice" WORKS! 

choice = float(choice)          #changes choice to float 

if choice == 1: 
    Convert(choice)           #attempts to feed "choice" into the function "convert" DOES NOT WORK :(
    print (Convert(1))          #then print the value created from convert (have also tried print(time) but it always returns 0) 

На данный момент это намеренно настроено только для того, чтобы принимать только 1 в качестве фактора. Я хочу, чтобы понять эту функцию вещь, прежде чем я пойти и сделать остальную часть возможных факторов

+3

thefourtheye избили меня до него. Я просто хочу сказать, что для новичка хорошая работа, поддерживающая действительно чистый код и добавление всех комментариев, чтобы люди могли легко ответить на ваш вопрос! – samrap

ответ

2

Когда вы

(dist/speed)/3600 

если (dist/speed) это меньше, чем 3600, результат будет равен 0. Вы можете попробовать, что из себя,

print 3599/3600 

напечатает

0 

Итак, вам нужно преобразовать данные в float следующим образом:

def Convert (factor): 
    speed = light*factor 
    return (float(dist)/float(speed))/3600.0 
+0

Использование python 3 это не должно быть проблемой – renfredxh

+0

Спасибо! Отлично! – qwerty22

1

Вы можете сделать это

if str(choice) in choices: 
    Convert(choice) 
    print (Convert(choice)) 

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

+1

Спасибо, все, что помогает мне уменьшить код, заставит его выглядеть более чистым/аккуратным, когда он станет помеченным. Я ценю ваш вклад/совет! – qwerty22

5

thefourtheye уже объяснил, почему, но если вы хотите, чтобы избежать этого в будущем вы могли бы перейти на Python 3 деления, помещая это в верхней части файла:

from __future__ import division 

В Python 3, ведет себя более интуитивно в таких ситуациях (1/2 == .5), в то время как вы все равно можете получить целочисленное деление с // (1//2 == 0)

+0

Хорошая альтернатива, я не знал этого о Python 3! – samrap

Смежные вопросы