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

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

新規登録して質問してみよう
ただいま回答率
85.35%
変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

3回答

6553閲覧

Pythonで変数が定義されているはずなのに関数内で使うとエラーが出てしまう。

robotKR

総合スコア32

変数

変数は、プログラミングにおいて値や文字列などのデータを保持できる仕組みを指します。自由に名前を付けることができるため、管理しやすくなるのが特徴です。プログラムで変数の宣言を行い、値を代入して利用。保持したデータが通用する範囲でローカル変数とグローバル変数に分けられます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2021/10/27 08:34

編集2021/10/27 09:38

発生している問題・エラーメッセージ

該当の変数はもう定義されているはずなのに、name 'tweets' is not definedというエラーが何故出てしまうのかわからないので教えてほしいです。
エラーメッセージは以下の通りです。

NameError Traceback (most recent call last) <ipython-input-2-e2b16b4975eb> in <module>() 90 return list(itertools.chain.from_iterable(xs)) 91 ---> 92 tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets]) 93 94 NameError: name 'tweets' is not defined

該当のソースコード

エラーが出た部分はここです。

Python

1def flatten(xs): 2 return list(itertools.chain.from_iterable(xs)) 3 4tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets])

全体的にはこのようなコードです。

Python

1import tweepy 2import csv 3import pprint 4import pandas as pd 5import os 6import time 7import datetime 8import re 9import itertools 10 11#ここはお決まりです。 12consumer_key = '' 13consumer_secret = '' 14access_token = '' 15access_token_secret = '' 16auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 17auth.set_access_token(access_token, access_token_secret) 18api = tweepy.API(auth) 19 20#ツイートを保存するGoogle Driveのディレクトリです。事前に作っておきましょう。 21drive_path = '/content/drive/MyDrive/tweet' 22#学習用のデータセットで必要なツイート数を指定しています。 23max_tweets = 10000 24 25def getMtTweet(): 26 #取得したツイートを格納するための配列 27 tweets = [] 28 num = 0 29 i = 1 30 print('page ' + str(i)) 31 #自分のタイムラインを取得するためuser_timelineを使用します。1リクエストで取得できるツイートの上限数は100です。 32 tweet_data = api.home_timeline(count=100) 33 if(len(tweet_data) > 0): 34 for tweet in tweet_data: 35 #データセット用に各ツイートの最後に<|endoftext|>をつけて整形します。 36 37 tweets.append([tweet.text+"<|endoftext|>"]) 38 num += 1 39 i += 1 40 next_max_id = tweet_data[-1].id 41 while True: 42 print('page ' + str(i)) 43 tweet_data = api.user_timeline(count=100, max_id=next_max_id-1) 44 if(len(tweet_data) > 0): 45 next_max_id = tweet_data[-1].id 46 for tweet in tweet_data: 47 tweets.append([tweet.text+"<|endoftext|>"]) 48 num += 1 49 if(num >= max_tweets): 50 break 51 i += 1 52 #Twitter API制限の上限でエラーにならないようにディレイをかけています。 53 time.sleep((15*60)/180) 54 else: 55 break 56 saveTweets(tweets) 57 else: 58 print('zero tweet') 59 60 61 62def saveTweets(tweets): 63 print(tweets) 64 ut = time.time() 65 tweets=list(itertools.chain.from_iterable(tweets)) 66 tweets=','.join(map(str, tweets))#list型をstr型に変換 67 tweets=re.sub(r'https?://[\w/:%#$&?()~.=+\-…]+', "", tweets) 68 tweets=re.sub('RT', "", tweets) 69 tweets=re.sub('お気に入り', "", tweets) 70 tweets=re.sub('まとめ', "", tweets) 71 tweets=re.sub(r'[!-~]', "", tweets)#半角記号,数字,英字 72 tweets=re.sub(r'[︰-@]', "", tweets)#全角記号 73 tweets=re.sub('\n', " ", tweets)#改行文字 74 print(tweets) 75 flatten(xs) 76 print(tweets) 77 78 #テキストファイルで保存 79 file_path = drive_path+'myTweets_' + str(ut) + '.txt' 80 file = open(file_path, 'w') 81 w = csv.writer(file) 82 w.writerows(tweets) 83 file.close() 84 85 with open(file_path) as f: 86 print(f.read()) 87 88 89def flatten(xs): 90 return list(itertools.chain.from_iterable(xs)) 91 92tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets]) 93 94 95getMtTweet()

試したこと

インターネットで調べて関数内で定義した変数は他の関数では使えないことはわかりましたが、ネットで見つけた解決策で上手く解決できなかったのでここで質問させていただきました。
試した解決策はグローバル変数にすることだった気がします。

解決する方法がわかる方、いらっしゃいましたら回答していただけたら幸いです。

追記:変数tweetsはgetMtTweetで作成したものです。

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

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

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

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

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

itagagaki

2021/10/27 08:42

> ネットで見つけた解決策 それはどういう解決策でしたか? その解決策をどう応用してみたのですか?
TakaiY

2021/10/27 08:44

エラーが発生している行で使っている「tweets」変数の中身は、どの関数で作った値ですか?
itagagaki

2021/10/27 08:48

あと、エラーが発生しているのは tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets]) の行なので、質問タイトルの「関数内で使うとエラーが出てしまう」は正しくない(思い込み)です。
robotKR

2021/10/27 09:33

指摘ありがとうございます〜 修正しておきます。
guest

回答3

0

関数内で定義した変数は、関数の外では使えません。

変数tweetsはgetMtTweetで作成したものです。

ということであれば、その値を外で使えるようにすればいいので、関数が値を返すようにするために、まずは、getMtTweet関数の最後で、「return tweets」として、値を返すようにします。

また、他の方も指摘しているように、作る前には使えませんので、順番を入れ替えて、いかのようにすれば、とりあえずそこは正しくなります。

python

1 2tweets = getMtTweet() 3 4tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets])

投稿2021/10/27 10:29

TakaiY

総合スコア13790

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

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

robotKR

2021/10/28 07:59

回答ありがとうございました~ 丁寧な回答ありがとうございました。
guest

0

ベストアンサー

問題は二つあります。

問題点1 関数は定義しただけでは実行されません。

tweets2d = flatten([[[content] for content in tweet.split(',')] for tweet in tweets])

よりも前に、

getMtTweet()

を実行しましょう。

問題点2 関数のローカル変数は関数の外では見えません。

def getMtTweet():

の中で

global tweets

と宣言しましょう。

投稿2021/10/27 08:56

ppaul

総合スコア24670

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

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

robotKR

2021/10/28 07:59

おかげさまでエラーの解決できました。 ありがとうございました~!
guest

0

関数内で定義されている変数はローカル変数です
他の関数では使えません

投稿2021/10/27 08:43

y_waiwai

総合スコア88042

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

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

itagagaki

2021/10/27 08:44

それは質問の「試したこと」に質問者が書いていることですね。
robotKR

2021/10/28 07:59

回答ありがとうございました~
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問