Hatena::Grouppython

Pythonの覚書

2012-11-18

Pythonも文字列と数値を+演算子で連結しようとするとエラーが発生。TypeError: cannot concatenate 'str' and 'int' objects

| 16:08 | Pythonも文字列と数値を+演算子で連結しようとするとエラーが発生。TypeError: cannot concatenate 'str' and 'int' objects - Pythonの覚書 を含むブックマーク はてなブックマーク - Pythonも文字列と数値を+演算子で連結しようとするとエラーが発生。TypeError: cannot concatenate 'str' and 'int' objects - Pythonの覚書 Pythonも文字列と数値を+演算子で連結しようとするとエラーが発生。TypeError: cannot concatenate 'str' and 'int' objects - Pythonの覚書 のブックマークコメント

HTMLの勉強をしようと、いろいろとタグ付けしてみて動作を見ようとしていてPythonに書かせていたときにつまづいたところ。

よくやっちまうんだけど、文字列と数値を連結して表示させようとすると怒られる。

Sample Code(サンプルコード)

print'<FORM>'
for size in range(1,21):
        size *= 10
        print '<INPUT type="text" size="' + size + '" name="' + 'textboxid'+ size +'"><br>'
print'</FORM>'

Result(実行結果)

Traceback (most recent call last):
  File "C:/Users/One-shot life/Desktop/html.py", line 3, in <module>
    print '<INPUT type="text" size="' + size + '" name="' + 'textboxid'+ size +'"><br>'
TypeError: cannot concatenate 'str' and 'int' objects

自分が悪いっちゃ悪いんだけど、いまいち釈然としない。

Pythonは、変数使用時、変数の型が自動的に決定される。変数を使用するのに、いちいち宣言をせねばならんのは面倒だ!と思っている私には、Pythonの言語仕様は気に入っている。

>>> digit =10
>>> string ='10'
>>> digit + string

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    digit + string
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 
>>> digit
10
>>> string
'10'

とこうなるわけですよね?この例で言うと、変数digitとstringの型は自動的に決定されている。じゃぁ、+演算子使ったときにも自動的に決定してくれないか?と私は思うわけです。もちろん、いつでも勝手にやってくれと思うわけではなく、明らかに文字列だとわかる場合は文字列として扱ってくれよというレベル。printの引数なんだから、表示したいっていうのはこちらからすれば明確。Pythonからすれば不明確と言われてしまえばそれまでだけど・・・。

数値と文字列をプログラマが区別しないと、勝手に動作して暴走して困るというシーンは無いわけではないけれども、もうちょっと融通利かないもんかなと思う。

数値を明示的に文字列にキャストすれば問題ないのだけれども・・・。

Sample Code(サンプルコード)

for size in range(1,21):
        size *= 10
        print '<INPUT type="text" size="' + str(size) + '" name="' + 'textboxid'+ str(size) +'><br>'

Result(実行結果)

<FORM>
<INPUT type="text" size="10" name="textboxid10"><br>
<INPUT type="text" size="20" name="textboxid20"><br>
<INPUT type="text" size="30" name="textboxid30"><br>
<INPUT type="text" size="40" name="textboxid40"><br>
<INPUT type="text" size="50" name="textboxid50"><br>
<INPUT type="text" size="60" name="textboxid60"><br>
<INPUT type="text" size="70" name="textboxid70"><br>
<INPUT type="text" size="80" name="textboxid80"><br>
<INPUT type="text" size="90" name="textboxid90"><br>
<INPUT type="text" size="100" name="textboxid100"><br>
<INPUT type="text" size="110" name="textboxid110"><br>
<INPUT type="text" size="120" name="textboxid120"><br>
<INPUT type="text" size="130" name="textboxid130"><br>
<INPUT type="text" size="140" name="textboxid140"><br>
<INPUT type="text" size="150" name="textboxid150"><br>
<INPUT type="text" size="160" name="textboxid160"><br>
<INPUT type="text" size="170" name="textboxid170"><br>
<INPUT type="text" size="180" name="textboxid180"><br>
<INPUT type="text" size="190" name="textboxid190"><br>
<INPUT type="text" size="200" name="textboxid200"><br>
</FORM>

2012-10-24

hatena記法(スーパーpre記法:シンタックス・ハイライト)でPython Shellから書いたときに、コピペすればブログに転機出来る形式で出力したい。

| 23:12 | hatena記法(スーパーpre記法:シンタックス・ハイライト)でPython Shellから書いたときに、コピペすればブログに転機出来る形式で出力したい。 - Pythonの覚書 を含むブックマーク はてなブックマーク - hatena記法(スーパーpre記法:シンタックス・ハイライト)でPython Shellから書いたときに、コピペすればブログに転機出来る形式で出力したい。 - Pythonの覚書 hatena記法(スーパーpre記法:シンタックス・ハイライト)でPython Shellから書いたときに、コピペすればブログに転機出来る形式で出力したい。 - Pythonの覚書 のブックマークコメント

こんな感じのファイルを用意してPython ShellでRUNする。

def start():
        print'>|python|'
       
def end():
        print'||<'

def h():
        t =raw_input("Title:")
        print "**%s" %t

こんな感じで出力される。

>>> h()

Title:spam

spam

>>> start()

>>> print "Hello world."
Hello world.
>>> end()

なんだか醜いなぁ。

これだったら、Linuxシェル使って、出力と実効の間にはてな記法挟んだほうがすっきりするかな。でも、Python Shellを使いたい・・・。何か上手い方法ないですかね?

2012-10-23

Pythonのlistの基本操作

| 21:18 | Pythonのlistの基本操作 - Pythonの覚書 を含むブックマーク はてなブックマーク - Pythonのlistの基本操作 - Pythonの覚書 Pythonのlistの基本操作 - Pythonの覚書 のブックマークコメント

Pytonのリストでちょっと遊んでみた。


Sample Code(サンプルコード)

宣言
>>> li =[]
>>> li
[]
>>> type(li)
<type 'list'>

空のリストの宣言、リストを表示、変数liの型を確認

要素追加
>>> for i in range(0,10):
	li.append(i+1)

	
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1~10までの数値をリストに追加。

正のインデックスでリストにアクセス
>>> li[0]
1

リストの0番目の要素を出力

負のインデックスでリストにアクセス
>>> li[-1]
10

リストの-1番目の要素を出力。負のインデックスでのアクセスは配列の後ろの要素へのアクセスとなる。

リストをポップ
>>> li.pop()
10

リストをポップ。後入れ先出しなので、最後の1つの要素を削除する。削除された要素が出力される。


リストのインデックス取得
>>> li.index(5)
4

値が5の要素のインデックスを出力


リストへ要素挿入
>>> li.insert(10,15)
>>> li
[1, 2, 3, 4, 5, 6, 7, 8, 9, 15]

リストの10番目に15を挿入

リストから要素削除
>>> li.remove(7)
>>> li
[1, 2, 3, 4, 5, 6, 8, 9, 15]
>>> 
リストから7を削除。*最初に7の値が入っている要素を削除。
リストを逆順に並び替える。≒降順に並び替える。
>>> li.reverse()
>>> li
[15, 9, 8, 6, 5, 4, 3, 2, 1] 

リストを逆順に並び替える。降順に並び替える。

リストを昇順に並び替える。
>>> li.sort()
>>> li
[1, 2, 3, 4, 5, 6, 8, 9, 15]

リストをソート昇順に並び替える。

リストの特定の値の要素数をカウント
>>> li.append(2)
>>> li.append(2)
>>> li.count(2)
3
>>> li
[1, 2, 3, 4, 5, 6, 8, 9, 15, 2, 2]
>>> 

リスト内の値2の個数を出力。リスト要素数ではない点に注意!

リストの要素数を取得
>>> len(li)
11

リスト要素数を出力

MS-DOSのプロンプト表示をPython Shell風にする

| 21:11 | MS-DOSのプロンプト表示をPython Shell風にする - Pythonの覚書 を含むブックマーク はてなブックマーク - MS-DOSのプロンプト表示をPython Shell風にする - Pythonの覚書 MS-DOSのプロンプト表示をPython Shell風にする - Pythonの覚書 のブックマークコメント


C:\Users\One-shot life>prompt $g$g$g

>>>

$gというのが>を意味するエスケープ文字。Python Shellっぽいでしょ?見た目に騙されないようにw

>>>type hello.pl
use strict;
use warnings;

print"Hello Python"
>>>perl hello.pl
Hello Python
>>>

こんな感じで使います。

DenisseDenisse2012/12/07 08:02Yeah, that's the tckiet, sir or ma'am

qcmhzrvdvwcqcmhzrvdvwc2012/12/08 15:06hKp12K <a href="http://wktsrnaiqdtm.com/">wktsrnaiqdtm</a>

cgryzkcgryzk2012/12/09 20:454f3wEg , [url=http://jpzfogwuxfbo.com/]jpzfogwuxfbo[/url], [link=http://bgthczgxtwsd.com/]bgthczgxtwsd[/link], http://bhjyemojipvs.com/

cgdhucwcfpcgdhucwcfp2012/12/10 10:43dw3apE <a href="http://jyyqnrddxfjg.com/">jyyqnrddxfjg</a>

cgdhucwcfpcgdhucwcfp2012/12/10 10:43dw3apE <a href="http://jyyqnrddxfjg.com/">jyyqnrddxfjg</a>

2012-10-19

Pythonじゃ++は使えないよ~。

| 19:34 | Pythonじゃ++は使えないよ~。 - Pythonの覚書 を含むブックマーク はてなブックマーク - Pythonじゃ++は使えないよ~。 - Pythonの覚書 Pythonじゃ++は使えないよ~。 - Pythonの覚書 のブックマークコメント

Sample Code(サンプルコード)

>>> i++
SyntaxError: invalid syntax

そもそもなんだが、++を有難く思っているプログラマの神経がわからない。C系の言語ではインクリメントがどうやら重要な処理だと思われているらしく、わざわざ++なるものを用意してくれている。単に1足すだけなんだけどね・・・。記述が簡易だとか、ローレベルなところで高速だというメリットがあるんだろうが、スクリプト言語では大して重要な処理でもない。

素直に、

>>> i +=1
>>> i
1
>>> 

こう書けばいい。


そもそも(2回目)なんだが、i++と++iの違いをわかっていないプログラマが多い。

例えば、C#のサンプルコードをを見て欲しい。

Sample Code(サンプルコード)

      int i = 0;
            Debug.WriteLine(i++);
            Debug.WriteLine(i);

            i = 0;
            Debug.WriteLine(++i);
            Debug.WriteLine(i);

Result(実行結果)

0
1
1
1

つまりは、i++は値を返却した後にインクリメントするのに対して、++iはインクリメントしてから値を返す。そこが違い。そんなの覚えたくもないし、知らない人にいちいち突っ込むのも面倒くせぇわ・・・。コピペプログラマが、バグを埋め込むには良い仕様だ。switchのcaseでbreakを忘れるプログラマがバグを埋め込むのが嫌だからswitchなんて無いというPythonでは、ごく自然な実装だ。


そもそも(3回目)なんだが、i++なんていつ使う???せいぜい、forループするときに役立つくらいだろう。それとて、C#のようにイテレーターの種類が豊富でパワフルな言語には、もはや用無しの仕様なんじゃないだろうかね・・・。Pythonとて同じこと。

参考までに、C#で0~9までループを回してみる。

Sample Code(サンプルコード)

   for(int i = 0; i<10; i++)
            {
                Debug.Write(i);
            }

Result(実行結果)

0123456789

そもそも(4回目)なんだが、このsyntaxがわかりにくい!

それだったら、pythonでこう書いたほうが楽だし見やすい。


Sample Code(サンプルコード)

>>> for i in range(0,10):
	print i,

	
0 1 2 3 4 5 6 7 8 9

いろいろ踏まえて++なんて紛らわしいだけで使えない。有難がっている人の心理が理解出来ない。++が使えないと嘆いている人の心理も理解出来ない。きっと、慣れ親しんだsyntaxが恋しくなっているとかそういう話じゃないのか?


そもそも(5回目)なんだが、++ってどこがいいんだ?

2012-10-18

List<string>を連結してstringにする。Pythonでもやってみた。

| 20:31 | Listを連結してstringにする。Pythonでもやってみた。 - Pythonの覚書 を含むブックマーク はてなブックマーク - Listを連結してstringにする。Pythonでもやってみた。 - Pythonの覚書 Listを連結してstringにする。Pythonでもやってみた。 - Pythonの覚書 のブックマークコメント

List<string>を連結してstringにする。 - oneshotlife_tomの日記

まさか、高級言語Pythonでこんなこと出来ないわけがないんだけど、Pythonの組み込み型のlistにはjoinが無いから、どうやって実装するんだ?と疑問に思ってググった人もいるかと思うので、軽くご紹介。Pythonではjoinはstr型の組み込みメソッドとして用意されている。もちろん、Pythonは変数の宣言なんて必要ないんで、いきなりセパレータの文字列を書いて.join(list)で呼んであげればいい。セパレータを使わない場合は?つまり、文字列を単純にくっつける場合は?以下のように書く。

Sample Code(サンプルコード)

>>> list =["Hello"," ","Wold!"]
>>> "".join(list)
'Hello Wold!'
>>> 

ErwinErwin2012/12/07 10:44Thanks for hpeling me to see things in a different light.

aijefzxaijefzx2012/12/08 15:36eLKeD9 <a href="http://gozcooplsuyp.com/">gozcooplsuyp</a>

witjvxouwitjvxou2012/12/09 21:03snSdya , [url=http://pulfxoxfneqv.com/]pulfxoxfneqv[/url], [link=http://bbvlzxqxllci.com/]bbvlzxqxllci[/link], http://qlvgzdtffbyv.com/

gwducxmohyhgwducxmohyh2012/12/10 10:59jmkjei <a href="http://rlonovmigmxt.com/">rlonovmigmxt</a>

uswymvofuswymvof2012/12/12 11:06lsnSSk , [url=http://gpwkgmovwhgm.com/]gpwkgmovwhgm[/url], [link=http://ftgevwdhdcik.com/]ftgevwdhdcik[/link], http://xelyorlrfogu.com/

uswymvofuswymvof2012/12/12 11:06lsnSSk , [url=http://gpwkgmovwhgm.com/]gpwkgmovwhgm[/url], [link=http://ftgevwdhdcik.com/]ftgevwdhdcik[/link], http://xelyorlrfogu.com/