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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

解決済

2回答

1275閲覧

range,for、変数[]の使い方について

dyrobin

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2021/08/24 14:43

下記の仕組みがよくわかりません。
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)

・LCD_WIDTHは16。
・0.1.2......15までrange関数でiに順に代入される
・message[1],message[2]...のようなイメージ
・messageはmain関数のwhile Trueループの"文字列text"が代入される。
・ord関数で文字列がユニコードに変換される。
上記までは理解しております。
この場合、messageの文字列(例えばCreated by)は一文字ずつ分解され、
一文字ずつがユニコードに変換されるという理解で間違いないでしょうか?
その場合、なぜそのような挙動になるのでしょうか?
[]これは通常リストや配列などで使用されるイメージです。
iが添え字として認識され、messageの文字列が一文字ずつに分解されるようなイメージでしょうか。(例えば、C,r,e,a,t,e,d,b,yと分解され、一文字ずつがユニコードに変換される)

ご教示よろしくお願いします。

下記が動作確認中のコードとなります。

python

1import smbus 2import time 3 4# Define some device parameters 5I2C_ADDR = 0x27 # I2C device address, if any error, change this address to 0x3f アドレス指定 6LCD_WIDTH = 16 # Maximum characters per line 7 8# Define some device constants 9LCD_CHR = 1 # Mode - Sending data 10LCD_CMD = 0 # Mode - Sending command 11 12LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line 13LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line 14LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line 15LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line 16 17LCD_BACKLIGHT = 0x08 # On 18#LCD_BACKLIGHT = 0x00 # Off 19 20ENABLE = 0b00000100 # Enable bit 21 22# Timing constants 23E_PULSE = 0.0005 24E_DELAY = 0.0005 25 26#Open I2C interface 27#bus = smbus.SMBus(0) # Rev 1 Pi uses 0 28bus = smbus.SMBus(1) # Rev 2 Pi uses 1 29 30def lcd_init(): 31 # Initialise display 32 lcd_byte(0x33,LCD_CMD) # 110011 Initialise 33 lcd_byte(0x32,LCD_CMD) # 110010 Initialise 34 lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction 35 lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off 36 lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size 37 lcd_byte(0x01,LCD_CMD) # 000001 Clear display 38 time.sleep(E_DELAY) 39 40def lcd_byte(bits, mode): 41 # Send byte to data pins 42 # bits = the data 43 # mode = 1 for data 44 # 0 for command 45 46 bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT 47 bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT 48 49 # High bits 50 bus.write_byte(I2C_ADDR, bits_high) 51 lcd_toggle_enable(bits_high) 52 53 # Low bits 54 bus.write_byte(I2C_ADDR, bits_low) 55 lcd_toggle_enable(bits_low) 56 57def lcd_toggle_enable(bits): 58 # Toggle enable 59 time.sleep(E_DELAY) 60 bus.write_byte(I2C_ADDR, (bits | ENABLE)) 61 time.sleep(E_PULSE) 62 bus.write_byte(I2C_ADDR,(bits & ~ENABLE)) 63 time.sleep(E_DELAY) 64 65def lcd_string(message,line): 66 # Send string to display 67 68 message = message.ljust(LCD_WIDTH," ") 69 70 lcd_byte(line, LCD_CMD) 71 72 for i in range(LCD_WIDTH): 73 lcd_byte(ord(message[i]),LCD_CHR) 74 75 76def main(): 77 # Main program block 78 79 # Initialise display 80 lcd_init() 81 82 while True: 83 # Send some test 84 lcd_string("Created by <",LCD_LINE_1) 85 lcd_string("Osoyoo.com <",LCD_LINE_2) 86 87 time.sleep(3) 88 89 # Send some more text 90 lcd_string("> Tutorial Url:",LCD_LINE_1) 91 lcd_string("> http://osoyoo.com",LCD_LINE_2) 92 93 time.sleep(3) 94 95if __name__ == '__main__': 96 97 try: 98 main() 99 except KeyboardInterrupt: 100 pass 101 finally: 102 lcd_byte(0x01, LCD_CMD) 103

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

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

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

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

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

guest

回答2

0

言ってしまえば、
「文字列は文字を並べたもので、つまり文字の配列という性質を持っている」
ということです。ですから[]で要素や部分列を切り出すことができます。

以下前提の部分ですが

・0.1.2......15までrange関数でiに順に代入される

r=range(16)
for i in r:
としてrange()関数がループに関わらなくてもiには0..15が順次代入されます
range()はその範囲の数列を生成する関数というだけで、iに順次代入するのはfor文の働きです。

・message[1],message[2]...のようなイメージ

間違っちゃいないですけど、普通は最初から書いてmessage[0], message[1]...とするかしら。

・messageはmain関数のwhile Trueループの"文字列text"が代入される。

言いたいことはなんとなくわかるけど文字列textって造語?はちょっと。

投稿2021/08/24 22:45

thkana

総合スコア7639

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

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

dyrobin

2021/08/24 23:10

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

0

ベストアンサー

「iが添え字として認識され、messageの文字列が一文字ずつに分解されるようなイメージでしょうか。(例えば、C,r,e,a,t,e,d,b,yと分解され、一文字ずつがユニコードに変換される)」ということであってますよ。

pythonの文字列は、リストと同じように[]を使って要素を取り出すことができるようになっているのです。
message[2:5]のような使いかたもできます。

投稿2021/08/24 15:50

TakaiY

総合スコア12769

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問