- -pv
スレッドの閲覧状況:
現在、- がスレを見ています。
これまでに合計 - 表示されました。
※PC・スマホの表示回数をカウントしてます。
※24時間表示がないスレのPVはリセットされます。

Pythonオレメモ

1名無しさん@おーぷん:2015/11/20(金)06:35:38 ID:iGB()
メモメモ!
130名無しさん@おーぷん :2016/05/29(日)08:57:57 ID:IK0
スライスをつかって代入することもできる
スライスの代入を行って、リストのサイズを変更したり、完全に消すことさえできます:

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']

スライスで入れ替え
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']

スライスで削除
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']

全部削除して空のリストにしてしまう
>>> letters[:] = []
>>> letters
[]
131名無しさん@おーぷん :2016/05/29(日)09:00:48 ID:IK0
関数 len() はリストにも使える

>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4

リストの場合は、要素の数が出力される
>>125で作った、ごちゃまぜリストで試してみよう

>>> gotcha = [1, '1234', 'リスト', 555, '']
>>> gotcha
[1, '1234', 'リスト', 555, '']
>> len(gotcha)
5

各要素の長さに関係なく要素の数が出てきたね!
132名無しさん@おーぷん :2016/05/29(日)09:02:15 ID:IK0
リストを入れ子にする、つまり「リストのリスト」を作ることも可能

リストa
>>> a = ['a', 'b', 'c']

リストn
>>> n = [1, 2, 3]

aとnをリストにしてみよう
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]

ちょっと見た目がややこしいが、よく見るとリストのリストが出来たのがわかるかな?

0番目の要素はaになっている
>>> x[0]
['a', 'b', 'c']

次の表記はa[1]と同じ意味になる
>>> x[0][1]
'b'
133名無しさん@おーぷん :2016/05/29(日)09:03:40 ID:IK0
さて、では問題
ちょっとだけレベルを上げるぞよ

問題1

次のような曜日を表すリストを作った
>>> weekday = ['日', '月', '火', '水', '木', '金', '土']
>>> weekday
['日', '月', '火', '水', '木', '金', '土']

今日は日曜日なわけだが、このリストを使って今日からx日数経過した後が何曜日かを知りたい

例えば
>>> x=4
なら、4日後なので
>>> weekday[x]
'木'
となる

でも、一年後を知りたいと思っても、このままではうまく行かない
>>> x=365
>>> weekday[x]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

そこで、うまく正の整数の入力に対して、ちゃんと曜日を出力する式を1行で作ってください
134名無しさん@おーぷん :2016/05/29(日)09:04:56 ID:IK0
問題2

2−1

次のようにしてゼロが好きな数だけ並んだリストを作ることができる
>>> zeros = [0] * 19
>>> zeros
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

このリストを3分割したいのだが、
端数があるといやなので3の倍数の長さになるように余分なものを切り取って欲しい
上の例だと19個あるので、末尾を削って18個になるようにする
20個のリストも18個にする
21個のリストは3の倍数だから21個のままでよい
というのをスライスを使って実現してください

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
135名無しさん@おーぷん :2016/05/29(日)09:05:50 ID:IK0
2−2
さてさて、上の方法で
3の倍数の個数だけゼロが並んだリストが用意出来たとする

>>> zeros = [0] * 12
>>> zeros
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

このリストの3分割したうちの真ん中部分に数値1を並べたい
>>> zeros
[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0]

ってのをスライスを使ってやってください


式や文は何行使ってもいいけど、今日の問題は全部1行で書けるから挑戦してみてね
今回のヒントは、リストの操作をよく読んで理解したら、あとは>>82

じゃあ、また次回
次はいよいよプログラムを書いていくからよろしくね!
ノシ
136名無しさん@おーぷん :2016/05/29(日)18:56:30 ID:3sz
>>122で書いたけど
tty1での日本語化ができないんじゃー!
137名無しさん@おーぷん :2016/05/29(日)21:16:50 ID:3sz
tty1での日本語化
なんとかできた
fbtermというのがキーワードみたいだけど
訳わからないままいろいろ試したので
どれが有効だったのかわからないまま
138名無しさん@おーぷん :2016/05/29(日)21:21:54 ID:3sz
いや
まだ日本語化はできてなかった
lsでの日本語表示はできたけど
漢字入力ができるわけではなかった
もうこの件はここまでにして
次に進むことにする
139名無しさん@おーぷん :2016/05/29(日)22:07:55 ID:3sz
>>115
遅くなりました
問題1の答
>>>s1+s[0:7]+s2+s[11:]
140名無しさん@おーぷん :2016/05/29(日)22:16:39 ID:3sz
>>116
問題2の答
>>>a=len(s)//2
>>>s1=s[0:a]
>>>s2=s[a:]
141名無しさん@おーぷん :2016/05/29(日)22:38:22 ID:3sz
>>133
>>>weekday[x%7]
142名無しさん@おーぷん :2016/05/29(日)22:56:07 ID:3sz
>>134
>>>zeros[len(zeros)//3*3:]=[]
143名無しさん@おーぷん :2016/05/29(日)23:12:56 ID:3sz
>>135
>>>zeros[len(zeros)//3:(len(zeros)//3)*2]=[1]*(len(zeros)//3)
144名無しさん@おーぷん :2016/05/30(月)06:58:59 ID:WTW
>>139
>>140
>>141
>>142
>>143
全部正解!オッケーオッケー
やってくれてありがとう

続きの準備ができたらまたきまっす
ノシ
145名無しさん@おーぷん :2016/05/30(月)08:14:53 ID:8j2
>>144
読むだけだとさらっと流してしまうところだけど
実際に問題を解くのに使ってみようとすると理解してないことがわかります
ありがたいです
146名無しさん@おーぷん :2016/05/30(月)19:48:33 ID:yJi
>>145
実際に頭と手を動かしておぼえた方が時間かかるけど身につくし楽しいしな
147名無しさん@おーぷん :2016/05/30(月)23:28:18 ID:8j2
覚えたようでまた忘れるから何度でもやらきゃですわ
148名無しさん@おーぷん :2016/06/01(水)22:16:44 ID:qX9
次回は週末の予定
if文やらfor文をやる予定
149名無しさん@おーぷん :2016/06/04(土)09:17:04 ID:FaO
さて、いよいよプログラムを書いてみたいのだが、少々問題がある

大抵のプログラム言語では複数の文をひとまとめにする「ブロック」という構造を持っている
例えば、CやJavaでは { } で囲まれた部分はブロックだ

Pythonではブロックを表現するのに
各行の先頭にスペースを入れる、つまり「インデント」=「字下げ」を使う
これは、人間の書く文章に非常に見た目が近く読みやすい、というメリットがあるが、
おーぷん2chでは各行の先頭スペースはカキコすると消えてしまう。
150名無しさん@おーぷん :2016/06/04(土)09:17:34 ID:FaO
そこで、このスレではプログラムソース内の字下げを表現するのに全角スペースを使います。

ただし、それではスレからコピペしたいときに文法エラーで不便になってしまうので
別途、コピペ用のリンクを用意します

hastebinというのは、短いテキストデータの共有して公開することができるサービスで
登録なし、インスコなし、広告なし、無料で画面超シンプルのなので、しばらく試してみようと思う
151名無しさん@おーぷん :2016/06/04(土)09:22:27 ID:FaO
試しに、プログラムソースを貼ってみるよ
うまくいきますように


```
# -*- coding: utf-8 -*-
'''
先頭インデントを全角スペースへ変換
'''

import sys
import re

for line in sys.stdin:
  line = line.rstrip()
  ma = re.match(r'^( +)(.*)', line)
  if ma:
    line = '  ' * (len(ma.group(1)) // 4) + ma.group(2)
  else:
    ma = re.match(r'^(\t+)(.*)', line)
    if ma:
      line = '  ' * len(ma.group(1)) + ma.group(2)
  print(line)

```

コピペ用リンク:http://hastebin.com/lacuriziyi
152名無しさん@おーぷん :2016/06/04(土)09:26:22 ID:FaO
ヨッシャーーー!
>>151
```
で囲まれた部分がソースコードね
ちなみに、内容はオイラがここにソースを貼り子するのに使う変換用のコードでござる

じゃあ、準備出来たらまた来ます
153名無しさん@おーぷん :2016/06/04(土)11:42:46 ID:FaO
さて、プログラムを書くにあたって必要なものがある
エディタ


特にどのようなエディタを使っても問題ないが、
必ず
utf-8
形式で保存できるものを使ってください
linuxの人は多分特に何か特殊な設定にしていない限りutf-8になっているはず

ソースコードをUTF8のテキスト形式で保存したら、

python ソースファイル

で実行できる
ソースファイルの名前は何でも良いが、拡張子は .py にしておくこと

実行して

SyntaxxError

が出たら、入力ミスのある場所が表示されるので、修正して再実行しよう
154名無しさん@おーぷん :2016/06/04(土)11:44:47 ID:FaO
では今日は
if ... elif ... else 文

サンプルプログラムは下記の通り

```

# -*- coding: utf-8 -*-

x = int(input("整数を入力してください: "))
if x < 0:
  x = 0
  print('負の数はゼロに変換します')
elif x == 0:
  print('ゼロです')
elif x == 1:
  print('イチです')
else:
  print('たくさんです')

```
155名無しさん@おーぷん :2016/06/04(土)11:47:39 ID:FaO
特に解説は不要だよね?
python特有のお約束として

if, elif, else文の末尾には:をつける
if, elif, elseのあとに続くブロックはインデントで表す

というのがある。
>>154では
  x = 0
  print('負の数はゼロに変換します')
の部分は文が2つあるが、一個のブロックで
きっちり同じレベルにインデントしないと正しく動作しないので注意
156名無しさん@おーぷん :2016/06/04(土)11:50:12 ID:FaO
いくつか新しく出てきたものを説明しておこう

# -*- coding: utf-8 -*-

この行は、ソースファイルがutf-8で書かれてますよってことを
pythonに教えた上げるための指定
テキストファイルってのはコンピューターから見ただけでは
文字コードが何かってことはわからないんで、明示してあげる
157名無しさん@おーぷん :2016/06/04(土)11:52:20 ID:FaO
x = int(input("整数を入力してください: "))


input関数はユーザーからの入力を文字列として受け取るための関数

4 3 リターン

と打ち込むと
'43'
が出力としてでてくる

int()関数は、入力を整数に変換する
ここでは文字列が入力になるので、それを数値に変換してくれる

'43'



43

になるわけだ
158名無しさん@おーぷん :2016/06/04(土)11:56:09 ID:FaO
>>154
のコピペ用リンクは
http://hastebin.com/ugabizexul.pl

これをテキストファイルにセーブして実行してみてください
もちろん、
>>154を手入力してもOK

とりあえず、今日はここまで
次回はfor文をやります
ノシ
159名無しさん@おーぷん :2016/06/04(土)17:36:13 ID:14q
あれ?
>>151も158も hastebin.comの先には何も表示されないけど・・・
160名無しさん@おーぷん :2016/06/04(土)20:32:47 ID:mzO
>>159
え、マジ!?
お使いのブラウザ何でしょう?
161名無しさん@おーぷん :2016/06/04(土)21:38:44 ID:14q
>>160
Firefoxです
162名無しさん@おーぷん :2016/06/04(土)21:41:10 ID:mzO
>>161
うーん、オイラのもFirefoxなんだよな
ちょっと調べてみる
163名無しさん@おーぷん :2016/06/04(土)22:40:07 ID:FaO
gistで公開してみました。
さすがにこんどは読めるかな?

>>154
https://gist.github.com/anonymous/0dd13a5f449b7467a8c0e881c02364e2

>>151
https://gist.github.com/anonymous/1460ad8f852cb624c17a8dec62dd3146

雰囲気的にちょっと大げさな感じになってしまうので微妙だが
複数ファイルを公開できるし便利は便利だろうからこちらに切り替えましょうかね
この講座そこまで続くのか!?って感じですがww
164名無しさん@おーぷん :2016/06/05(日)10:48:10 ID:p1n
>>163
見やすいです
165名無しさん@おーぷん :2016/06/05(日)11:00:23 ID:p1n
まだMintLinuxの日本語化で足踏みしてる
デスクトップ環境の方の日本語化は問題ないのだけど
コンソール(ctrl+alt+f1で出るtty1の方)で日本語が◆で文字化けする
nanoで日本語が表示できるようしたい
166名無しさん@おーぷん :2016/06/05(日)11:22:51 ID:p1n
>>165はもう諦める方がいいかな 
いくらググってもやり方が出てこない

MintLinuxを英語版でインストールしてみることにする
167名無しさん@おーぷん :2016/06/12(日)20:46:36 ID:lsT
ちょっと間が空いてしまってすまない

では、for文から再開しましょう
pythonのfor文はCやjavaのforとちょっと雰囲気が違います

pythonのfor文はリストのようなものの要素の分だけループをぶん回す、というもの

では早速、例。十二支の文字を表示するプログラム
```
# -*- coding: utf-8 -*-

junishi = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']

for eto in junishi:
  print(eto)
```
168名無しさん@おーぷん :2016/06/12(日)20:47:28 ID:lsT
リストに限らず、要素ごとに繰り返すことができるようなオブジェクトであればなんでもよい
なので、例えば先程の例だと文字列で同じことができる

```
# -*- coding: utf-8 -*-

junishi_str = '子丑寅卯辰巳午未申酉戌亥'

for eto in junishi_str:
  print(eto)
```
169名無しさん@おーぷん :2016/06/12(日)20:48:14 ID:lsT
では、CやJavaのように一定回数だけループを回したいときはどうするか?
数字のリストをつくればよい

for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
  print(i)

でもこれはメンドクサイので、通常range()関数をつかって行う

for i in range(10):
  print(i)
170名無しさん@おーぷん :2016/06/12(日)20:49:12 ID:lsT
range()関数はリストのような繰り返し用オブジェクトを作ってくれる
いくつか例を

range(10)

0から9まで

range(5, 10)

5から9まで

増え方を指定する場合の例

range(0, 10, 3)

0, 3, 6, 9

range(-10, -100, -30)

-10, -40, -70
171名無しさん@おーぷん :2016/06/12(日)20:50:09 ID:lsT
でもやっぱりループをリストにしてぶん回すときに、
値だけでなく何番目か、という情報もほしいことがよくある
そういう場合、enumerate()関数を使う

たとえば、さきほどの干支の例で、
干支の番号と干支の文字を並べて表示したい場合には

for i, j in enumerate(junishi):
  print(i, j)

とやるのが一般的でございます
実行して、何が起こるか確かめて理解してほしい
172名無しさん@おーぷん :2016/06/12(日)20:50:39 ID:lsT
さて、では簡単な課題
forとrangeを使って、九九の答え、
つまり1x1=1〜9x9=81の掛け算の答えを全部表示するプログラムを作ってください

表示結果は
1
2
3
4
5
6
7
8
9
2
4
6
...とつづいて
56
64
72
9
18
27
36
45
54
63
72
81
で終了すれば正解
173名無しさん@おーぷん :2016/06/12(日)20:50:59 ID:lsT
次回は文字列のformatをやって、この課題をもとに九九の表を表示するプログラムを作りましょうか

今日のソースコードはこちら
https://gist.github.com/anonymous/a11477c3081338028943604ff651660a

ではでは
ノシ
174名無しさん@おーぷん :2016/06/13(月)23:46:50 ID:49w
>>172
 for i in range(11,100):
  if(i % 10)>0:
  print((i//10)*(i%10))
175名無しさん@おーぷん :2016/06/13(月)23:48:42 ID:49w
for i in range(11,100):
 if(i % 10)>0:
  print((i//10)*(i%10))
176名無しさん@おーぷん :2016/06/14(火)07:26:55 ID:Ylx
>>174
なかなか面白い!
ちょっと感心したw

簡単には普通にrange(1,10)を二重ループにしてくれればいいのよ
177名無しさん@おーぷん :2016/06/15(水)08:11:01 ID:cxb
普通じゃつまらないから
なんとか別の方法を考えてみたのですよ

行列の方法がありそうに思うのだけど
知らないからそれは諦めた
178名無しさん@おーぷん :2016/06/15(水)12:47:21 ID:bam
>>177
itertoolsというモジュールを使うと簡単にできます
便利なので次回ちょっとやりましょう
179名無しさん@おーぷん :2016/06/16(木)07:49:34 ID:abB
行列そのものを知らないのだけどね

新着レスの表示 | ここまで読んだ

名前: mail:





Pythonオレメモ
CRITEO