2013-10-15 3 views
1

Я новичок здесь, и я привык к программированию с Python. Я искал в Интернете поиски полезных ответов, но было невозможно найти решение моей проблемы.ошибка python: требуется float

Вот он идет:

radiation=1.3888 
n=17 
LAT=51.05 

def dec(n): 
    if 0<n<365: 
     dec=23.45*math.sin(math.radians(360*(284+n)/365)) 
     print(dec) 
    else: 
     print('the day',n,'is not valid') 

def wss(LAT,dec): 
    wss=math.degrees(math.acos(((math.tan(math.radians(LAT)))*math.tan(math.radians(dec))))) 
    print(wss) 

--- Когда я запускаю этот код это то, что я получаю:

>>> dec(n) 
-20.91696257447642 

>>> wss(LAT,dec) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:/Users/Gerard/Dropbox/Master Thesis Gerard Pujol/Master Thesis Work/work hourly radiation OK.py", line 25, in wss 
    wss=math.degrees(math.acos(-((math.tan(math.radians(LAT)))*math.tan(math.radians(dec))))) 
TypeError: a float is required 

Я не знаю, почему Python дает мне этот тип ошибки : «требуется поплавок».

Я пробовал много изменений, но был бесполезен. Надеюсь, у кого-то есть решение моей проблемы. Большое спасибо!

+4

исправить форматирование вашего кода –

+1

(я поместил код в кодовые блоки, но он также с отступом неправильно) – geoffspear

+0

Похоже, вы вызываете 'math.radians (dec)'; 'dec' - это функция, а не значение; возможно, вы хотели называть 'dec (что-то)'? – geoffspear

ответ

0

Переменная dec используется как для имени функции, так и для переменной. Python видит это имя функции в ошибке.

0

Что вы хотите сделать что-то вроде

def dec(n): 
    if 0<n<365: 
     dec = 23.45*math.sin(math.radians(360*(284+n)/365)) 
    else: 
     print('the day %d is not valid' %n) 
     return 
    return(dec) 

, а затем позвонить

wss(LAT, dec(n)) 

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

+1

, пожалуйста, проверьте свои факты. Функции Python - это объекты, и вы можете передавать их как аргументы, подобные любому другому объекту. Также в этом случае 'dec()' не возвращает float, он возвращает 'None'. –

+0

Мой плохой, я слишком быстро прочитал вопрос. Я исправил свой ответ. – MBR

+0

Спасибо, сэр, это работает! Благодарю! Я сражался часами без успеха .. Мне нужно учиться больше! – gpujol

0

Прежде всего, ваше форматирование ужасно. Узнайте, как должен выглядеть код - он сэкономит вам много времени, особенно при отладке.

Во-вторых, при запуске: WSS (LAT, декабрь)

Вы передать 2 аргумента в функции «WSS», первый из них LAT = 51,05, но вы никогда не определен аргумент под названием «Декабре» - вы определили такую ​​функцию.

Что вы хотите сделать что-то вроде этого:

import math 

n=17 
LAT=51.05 

def CalcDec(n): 
    if 0<n<365: 
     dec=23.45*math.sin(math.radians(360*(284+n)/365)) 
     return dec 

def CalcWss(LAT,dec): 
    wss=math.degrees(math.acos(((math.tan(math.radians(LAT)))*math.tan(math.radians(dec))))) 
    return wss 

print CalcWss(LAT, CalcDec(n)) 

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

+0

Все еще довольно запутанно использовать переменную, называемую 'dec' внутри функции' dec() ', и почему' '(') '' на одном из 'return', но не в другом? – unwind

+0

это была быстрая копия-макароны ;-), теперь она немного читаема. –

+0

Спасибо, сэр, это работает! Благодарю! Я сражался часами без успеха .. Мне нужно учиться больше! – gpujol

0

Вы сначала должны фактически вернуть что-то из функции dec() - ни присвоение локального имени, ни печать на стандартный вывод не будет делать:

def dec(n): 
    if not 0 < n < 365: 
     # that's how you handle incorrect arguments in Python 
     raise ValueError("'%s' is not a valid day number" % n) 

    # 'n' is valid, let's proceed: 
    return 23.45 * math.sin(math.radians(360 * (284 + n)/365.0)) 

сейчас вы можете использовать это значение, либо через промежуточную переменную:

LAT = 51.5 
n = dec(17) 
print wss(LAT, n) 

Или просто пропустить промежуточную переменную:

print wss(51.5, dec(17)) 

NB: при использовании Python 3.х, заменить print <something> с print(<something>)

0
radiation=1.3888 

    n=17 

    LAT=51.05 

    def dec(n): 

     if 0<n<365: 

      dec=23.45*math.sin(math.radians(360*(284+n)/365)) 
      print (dec) 
      return dec 

     else: 

      print('the day',n,'is not valid') 
      return -1 


    def wss(LAT,dec): 

     wss=math.degrees(math.acos(((math.tan(math.radians(LAT)))*math.tan(math.radians(dec))))) 

     print(wss) 

Затем сделайте:

>>> dec = dec(n) 
-20.91696257447642 
>>> wss(LAT,dec) 

Это будет работать. Чтобы узнать, почему ваш код не работает, читайте дальше.

Что вы делаете с def wss(LAT,dec), так это то, что вы определяете функцию, которая передает два аргумента LAT и dec. Однако, когда вы на самом деле вызываете эту функцию (например, >>>wss(LAT,dec)), вы не установили никакого значения для dec. У вас есть значение в dec(n), но вы его никому не назначили. Сравните это с переменной LAT, которой вы присвоили значение. (Помните, LAT=51.05?) ?)

+0

Большое спасибо! Я так благодарен! – gpujol

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