質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1580閲覧

配列から関数に複数の引数を送る方法

usuallyi

総合スコア41

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/01/28 15:21

編集2022/01/12 10:55

配列から、関数に複数の引数を送るやり方が分からず困っています。

また、
以下のエラーが発生してしまいます。
ValueError: could not convert string to float: max_wind_direction

以下がプログラム一部抜粋です。

python

1# coding: utf-8 2import codecs 3import math 4 5class JMACSVReader(object): 6 def __init__(self, filename,format,encoding='shift_jisx0213', header_ofs=6): 7 self.format = format 8 self._istream = codecs.open(filename, 'r', encoding) 9 for i in range(header_ofs): 10 self._istream.readline() # ヘッダを読み飛ばす 11 12 def _parse_line(self,line): 13 record = {} 14 for k,v in zip(self.format, line.split(',')): 15 if k is not None: 16 record[k] = v 17 return record 18 19 def __iter__(self): 20 for line in self._istream: 21 yield(self._parse_line(line)) 22 23weather_codes = [ 24 (u'薄', 'Usu'),(u'大', 'Oo'), 25 (u'暴風雨', 'Bofu'), (u'快晴', 'Kaisei'), 26 (u'雨', 'Ame'),(u'晴', 'Hare'), 27 (u'雪', 'Yuki'), (u'曇', 'Kumori'), 28 (u'みぞれ', 'Mizore'), (u'ひょう', 'Hyo'), 29 (u'霧', 'Kiri'), 30] 31 32sincos_codes = [ 33 (u'北','0'),(u'東','90'), 34 (u'南','180'),(u'西','270'), 35 (u'北北東','23'),(u'北東','45'), 36 (u'東北東','68'),(u'東南東','113'), 37 (u'南東','135'),(u'南南東','158'), 38 (u'南南西','203'),(u'南西','225'), 39 (u'西南西','248'),(u'西北西','293'), 40 (u'北西','315'),(u'北北西','338'), 41] 42 43wind_direction_codes = [ 44 (u'北', 'N'),(u'東','S'), 45 (u'南','S'),(u'西','N'), 46 (u'北北東','N'),(u'北東','N'), 47 (u'東北東','N'),(u'東南東','S'), 48 (u'南東','S'),(u'南南東','S'), 49 (u'南南西','S'),(u'南西','S'), 50 (u'西南西','E'),(u'西北西','N'), 51 (u'北西','N'),(u'北北西','N'), 52] 53 54def ame(weather): 55 yuki_length=weather.find(u'雪') 56 ame_length=weather.find(u'雨') 57 if(yuki_length==-1): 58 weather= u'雨' 59 return weather 60 if(ame_length<yuki_length): 61 weather= u'雨' 62 return weather 63 else: 64 weather= u'雪' 65 return weather 66 67def ame_yuki(weather): 68 if u'雨' in weather: 69 weather=ame(weather) 70 return weather 71 elif u'雪' in weather: 72 weather= u'雪' 73 return weather 74 elif u'みぞれ' in weather: 75 weather= u'雪' 76 return weather 77 elif u'ひょう' in weather: 78 weather= u'雪' 79 return weather 80 else: 81 return weather 82 83 84def wind_direction(wind): 85 86 for k,v in wind_direction_codes: 87 wind = re.sub('^%s$'%k,v,wind.strip()) 88 return wind 89def exchange_cos(rad): 90 test=float(rad) 91 test=math.radians(test) 92 hi=math.cos(test) 93 return hi 94 95def wind_exchange_cos(wind_s,wind): 96 for k,v in sincos_codes: 97 wind = re.sub('^%s$'%k,v,wind.strip()) 98 wind=exchange_cos(wind) 99 #test=math.radians(wind) 100 #hi=math.sin(test) 101 wind=wind_s*wind 102 #print str(wind).encode('utf-8') 103 return str(wind).encode('utf-8') 104 105def exchange_sin(rad): 106 test=float(rad) 107 test=math.radians(test) 108 hi=math.sin(test) 109 return hi 110 111def wind_exchange_sin(wind_s,wind): 112 for k,v in sincos_codes: 113 wind = re.sub('^%s$'%k,v,wind.strip()) 114 wind=exchange_sin(wind) 115 #test=math.radians(wind) 116 #hi=math.sin(test) 117 wind=wind_s*wind 118 #print str(wind).encode('utf-8') 119 return str(wind).encode('utf-8') 120 121def encode_weather(weather): 122 # 日本語があると何かと面倒なのでコード値にしてしまう。彦根市は上記のルールだけで大丈夫だったが、他の地域や期間に対応するにはパターンを増やす必要があるかも。 123 # 「晴れ一時雨後曇り」とか後ろについてくるやつは面倒くさいので除去する。 124 125 weather=ame_yuki(weather) 126 wcode = re.sub( u'(一時|時々|後|、).*','',weather.strip()) 127 128 for k,v in weather_codes: 129 wcode = wcode.replace(k,v) 130 return wcode 131 132def format_file_main(filename, in_format, out_format): 133 jmacsv = JMACSVReader(filename, in_format) 134 for record in jmacsv: 135 line = [] 136 for of in out_format: 137 if isinstance(of,tuple): 138 line.append(of[1](record[of[0]])) 139 else: 140 line.append(record[of]) 141 print(u'\t'.join(line).encode('utf-8')) 142 143if __name__=='__main__': 144 # usage: jmaformat.py data.csv 145 import sys 146 import re 147 in_format = [ 148 'date', 149 'temp_max',None,None, 150 'temp_min',None,None, 151 'weather',None,None, 152 'total_rainfall',None,None,None, 153 'avg_windspeed',None,None, 154 'avg_atom',None,None, 155 'avg_humid',None,None, 156 'avg_temp',None,None, 157 'hours_of_sunshine',None,None,None, 158 'highest_snow_depth',None,None,None, 159 'max_windspeed',None,'max_wind_direction',None,None, 160 'max_instantaneous_windspeed',None,'max_instantaneous_wind_direction',None,None,None,None,None, 161 'avg_vapor_pressure',None,None, 162 'min_atom',None,None, 163 'avg_humid',None,None, 164 'min_humid',None,None,None, 165 '10min_avg_cloudcover',None,None, 166 'total_snow_depth',None,None,None, 167 'total_solar_insolation',None,None, 168 '1hour_max_rainfall',None,None,None, 169 ] 170 171 172 out_format = ['date','temp_max','temp_min','total_rainfall', 173 'avg_windspeed','avg_atom','avg_humid','avg_temp', 'hours_of_sunshine', 174 'highest_snow_depth','max_windspeed', 175 (wind_exchange_sin(max_windspeed,max_wind_direction)),(wind_exchange_cos(max_windspeed,max_wind_direction)), 176 'max_instantaneous_windspeed',('max_instantaneous_wind_direction',wind_exchange_sin),('max_instantaneous_wind_direction',wind_exchange_cos), 177 'avg_vapor_pressure','min_atom','avg_humid','min_humid','10min_avg_cloudcover', 178 'total_snow_depth','total_solar_insolation','1hour_max_rainfall',('weather', encode_weather ),] 179 180 181 182 for file in sys.argv[1:]: 183 format_file_main(file,in_format,out_format)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

配列内のmax_windspeedに戻り値って、渡せているのでしょうか?

python

1out_format =['date',(wind_exchange_sin('max_windspeed','max_wind_direction')),]

つまりwind_exchange_sinの結果がout_formatに代入されているか?ということですか?

ちゃんと実行されれば代入されていると思いますが、エラーが出てる状態では代入されていないと思います。

投稿2017/01/28 15:39

black_sleepman

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usuallyi

2017/01/28 15:50

プログラムを追加しましたが、 max_wind_directionの変数を引数にしたいのですが、 max_wind_directionの文字が、送られてしまっていて上手く行ってません。
black_sleepman

2017/01/28 15:56

あ、すみません。勘違いしていました。max_wind_directionというのは文字の配列ということでいいのでしょうか。そうなると out_format =['date',(wind_exchange_sin(max_windspeed,max_wind_direction)),] wind_exchange_sinに渡す引数にシングルクォートをつける必要はないです。 ''でくくると文字列になってしまっているので、'max_wind_direction'という文字列が送られることになっています。 で、max_wind_directionが配列で一つずつ要素を取り出して処理させたいならば for data in max_wind_direction: exchange(data) のようにすれば要素ごとに操作することができます。
usuallyi

2017/01/28 16:04

プログラムを更新しました!! in_formatで定義した。 関数の引数である、max_windspeed,max_wind_directionが、 どちらも、名前が定義されていないことになってしまいます。
guest

0

ValueError: could not convert string to float: max_wind_direction

これはstring型からfloat型へ変換できないというエラーです。たぶんソースのどこかmax_wind_directionが使われていると思うのですが、それに文字列が入っているのが原因だと思います。

なので、配列自体は関数に渡せていると思いますよ!

投稿2017/01/28 15:28

編集2017/01/28 15:29
black_sleepman

総合スコア220

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usuallyi

2017/01/28 15:32

配列内のmax_windspeedに戻り値って、渡せているのでしょうか?
usuallyi

2017/01/28 15:35

実際は、max_wind_directionに文字データが入っており、 以下の文で文字データから数字に変換しているのですが、 エラーになってしまいます。 wind = re.sub('^%s$'%k,v,wind_s.strip())
black_sleepman

2017/01/28 15:45

``` def exchange(rad): test=float(rad) test=math.radians(test) hi=math.sin(test) return hi ``` ここに`wind`を渡してるときにエラーが出ていると思います。 今引数にしている変数がどのような型になっているのかを、`type(wind)`のように確認して行く方がいいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問