<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>はらぺこ日誌 &#187; Python</title>
	<atom:link href="https://blog.harapeko.jp/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.harapeko.jp</link>
	<description>株式会社はらぺこ 公式ブログ</description>
	<lastBuildDate>Mon, 30 Oct 2017 14:32:56 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.2</generator>
	<item>
		<title>Python 習得中 &#8211; その 6</title>
		<link>https://blog.harapeko.jp/2017/04/09/python-learning-6/</link>
		<comments>https://blog.harapeko.jp/2017/04/09/python-learning-6/#comments</comments>
		<pubDate>Sun, 09 Apr 2017 06:13:53 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=401</guid>
		<description><![CDATA[今回は 5章、モジュールの import の仕方やモジュールの書き方、あとはいくつかの標準ライブラリの紹介です [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回は 5章、モジュールの import の仕方やモジュールの書き方、あとはいくつかの標準ライブラリの紹介です。</p>
<p>手元ではもう概ね読了しています。ブログに書くのは一旦ここまでで終了しようかなと思っています… こうやって書き出すよりいろいろ作って実践していったほうが身につくのは早そうなので…。</p>
<p><span id="more-401"></span></p>
<h3>モジュールのパッケージ</h3>
<ol>
<li>ライブラリパスの通ったディレクトリ下にディレクトリを作成</li>
<li>その下に Python モジュールとして読み込ませるクラスや関数を書いた <code>.py</code> ファイルを作成</li>
<li>↑と同じ場所に <code>__init__.py</code> という名前の空のファイルを作成</li>
</ol>
<p>ロードするときは、ディレクトリ名が <code>package_dir</code> で、その配下にある <code>hoge.py</code> ファイルに定義されたクラスや関数をすべてロードする場合、以下の通りとなる。</p>
<pre>
from package_dir import hoge

# MyHogeHoge クラスのコンストラクタを呼ぶ場合
x = hoge.MyHogeHoge('params', '...')
</pre>
<p>名前空間はディレクトリ名、ファイル名にがっつり依存するので、ファイル構成は結構気をつけたほうが良さそうです…。</p>
<h3><code>defaultdict</code></h3>
<p>Python の辞書は存在しないキーを指定して参照しようとするとエラーになるので、キーが存在しない可能性がある場合は <code>in</code> でテストするか <code>get()</code> メソッド (存在しない場合はデフォルト値が返される) を介する必要があります。これは存在しないキーを指定してもデフォルトでエラーにならない Perl の連想配列の実装に比べて利点だと思うのですが (この挙動のおかげでバグを作りこんでしまうことが Perl の場合は本当に多い)、 <code>defaultdict()</code> はこの悪しき Perl の連想配列に似た挙動がデフォルトである上に、一度参照してしまうとそのキーにデフォルト値が割り当てられてしまうという最悪な動きをする代物です。</p>
<p>こんなの使うことあるんでしょうか…(´･_･`)</p>
<p>組み込みの辞書よりもスクリプト然としたコードを書くのに向いているのかもしれませんが (本書に示されている独自カウンタのサンプルのような… それもその直後に <code>Counter</code> を用いたずっと簡潔な書き方を示すことでくつがえ)、その割には冒頭で割と覚えにくい名前のパッケージ名からロードしてあげないといけないのも使い勝手としてはいまいちです。</p>
<h3><code>Counter</code></h3>
<p>積集合、和集合が取れるのがいいですね。</p>
<h3><code>OrderedDict</code></h3>
<p>Perl では古の pseudo hash を思い出しました…(&#8216;A`)</p>
<h3>その他</h3>
<p>いろいろあるみたいですが、<a href="http://docs.python.jp/3/library/" title="Python 標準ライブラリ — Python 3.6.1 ドキュメント">必要に応じて探してくれば良いのかなと思います</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2017/04/09/python-learning-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python 習得中 &#8211; その5</title>
		<link>https://blog.harapeko.jp/2017/03/22/python-learning-5/</link>
		<comments>https://blog.harapeko.jp/2017/03/22/python-learning-5/#comments</comments>
		<pubDate>Tue, 21 Mar 2017 21:02:31 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[O'reilly]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=398</guid>
		<description><![CDATA[業務が始まったこともあり、間が空いてしまいました。余談ですが、業務でもすでに段階的に Python を使い始め [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>業務が始まったこともあり、間が空いてしまいました。余談ですが、業務でもすでに段階的に Python を使い始めておりまして、 selenium と BeautifulSoup を使って Web スクレイピングでクローリングする script kiddy な感じのツールをメンテする準備を進めたりしています。</p>
<p>「<a href="https://www.oreilly.co.jp/books/9784873117386/">入門Python3</a>」は電子版を購入したのですが、 O&#8217;reilly の電子書籍は一度購入してしまえば O&#8217;reilly のサイトからいつでもどこでもダウンロードできます。閲覧規制が若干厳しい職場の環境でもダウンロードできたので何気に便利で快適です<tt>^^</tt>。</p>
<p>今回は 4章の 4.6節から。手元ではすでに 8章の途中ぐらいまで概ね読み終わっているのですが、今回は 4章までの内容について記述します。</p>
<p><span id="more-398"></span></p>
<h3>内包表記</h3>
<p>Python をして、もっともスクリプト言語らしい機能のひとつであるように思います。ザ・構文糖衣。</p>
<pre>
number_list = [n for n in range(0, 10)]
</pre>
<p>ちなみにこれ、Perl で書くとこうなります。</p>
<pre>
@number_list = (0..9)
</pre>
<p>他の LL を学べば学ぶほど、 Perl が如何にスクリプト然としているかがよく分かるという一例です…。</p>
<p>なお、 Python は <code>range</code> にしてもスライスにしても、終端値は含まれないことに注意する必要があります。</p>
<p><code>range</code> 自体にも step が指定できますが、内包表記の後ろに <code>if</code> 文を入れることでデータに含める値の条件を指定することもできます。下は凡庸な例ですが、既存のリストから条件を指定して値を抽出したいケースは多々あります。</p>
<pre>
even_list = [num for num in range(0, 6) if num % 2 == 0]  # 0, 2, 4
</pre>
<p>C# の Linq みたいなことをやりたい場合はジェネレータ内包表記でいろいろとできそうです… (例が思いつかないですが</p>
<h3>可変長引数</h3>
<p><q><code>*</code></q> で始まる仮引数は位置引数のタプル、<q><code>**</code></q> で始まる仮引数はキーワード引数の辞書になる、というもの。</p>
<p>python の性質として面白いなと思うのは、位置引数とキーワード引数がこの仕組みによって完全に分離しうるということ。キーワード引数として指定しないと有効にならないパラメータ、なんてのも書こうと思えば書けてしまえるわけです。実際使うかは別として。</p>
<h3>ラムダ</h3>
<pre>
lambda a, b: b - a
</pre>
<p>のような構文で書けるみたいです。 (ソートの比較条件を指定する場面ってあるのかしら…?)</p>
<h3>ジェネレータ</h3>
<p>C# でいうところの <code>IEnumerable</code> みたいなもんですね。 <code>yield</code> キーワードは他の言語でもよく使われていてまぁまぁありふれた存在となりつつあります…。</p>
<h3>デコレータ</h3>
<p>可変長引数が最も活躍するやつです。 C# の Attribute みたいなもんですかね。</p>
<h3>スコープと <code>global</code> 宣言</h3>
<p>関数内で変数を使用する際、同じ名前の変数がすでにグローバル名前空間に存在するときの挙動が、最初に値を代入するのか、値を参照するのかで変わるという、実に気持ち悪い内容に困惑するなど。</p>
<p>グローバル変数にアクセスしたい場合は <code>global</code> 宣言を使え、はいいんですが、関数内で閉じたスコープで使いたい場合に特別な宣言が必要ないというのがどうにもしっくりこないですね。</p>
<h3>例外</h3>
<p>…については、 <code>catch</code> ではなく <code>except</code> であることと、 <code>throw</code> ではなく <code>raise</code> であること以外は普通だと思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2017/03/22/python-learning-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python 習得中 &#8211; その 4</title>
		<link>https://blog.harapeko.jp/2017/02/25/python-learning-4/</link>
		<comments>https://blog.harapeko.jp/2017/02/25/python-learning-4/#comments</comments>
		<pubDate>Sat, 25 Feb 2017 07:29:28 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=395</guid>
		<description><![CDATA[今日は 4章の 4.5節まで。 複数の不等号を含む評価式が書ける 変数が取りうる値の範囲を調べる場合、その変数 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今日は 4章の 4.5節まで。</p>
<p><span id="more-395"></span></p>
<h3>複数の不等号を含む評価式が書ける</h3>
<p>変数が取りうる値の範囲を調べる場合、その変数を <code>and</code> を挟んで 2回書く代わりに、複数の不等号を含む単一の評価式として書くことができる。</p>
<pre>
&gt;&gt;&gt; x = 7
&gt;&gt;&gt; 5 &lt; x &lt; 10
True
&gt;&gt;&gt; x = 2
&gt;&gt;&gt; 5 &lt; x &lt; 10
False
&gt;&gt;&gt; y = 200
&gt;&gt;&gt; 0 &lt; x &lt; 100 &lt; y &lt; 1000
True
</pre>
<p>こういう書き方できればいいのになぁと思うことは多々あったが、実際できる言語が存在するんですなぁ…。</p>
<h3>ループブロックの <code>else</code> 節</h3>
<p>ループブロックに <code>else</code> 節をつけると、 <code>break</code> 等による中断以外でループ終了する時に呼ばれるようです。</p>
<pre>
&gt;&gt;&gt; numbers = []
&gt;&gt;&gt; count = 0
&gt;&gt;&gt; while count &lt; 5:
...     val = input(str(count + 1) + "番目の整数を入力: ")
...     if val == 'q':
...             break
...     numbers.append(int(val))
...     count += 1
... else:
...     print(numbers, "の合計: ", sum(numbers))
... 
1番目の整数を入力: 1
2番目の整数を入力: 2
3番目の整数を入力: 3
4番目の整数を入力: 5
5番目の整数を入力: 7
[1, 2, 3, 5, 7] の合計:  18
</pre>
<p>使いどころはそれなりにあると思うのですが、これに <code>else</code> の名を冠するのは正直わかりにくい気もします…。</p>
<h3>いろいろと便利な <code>zip()</code> 関数</h3>
<p>複数のシーケンスを並列的に反復処理できる。</p>
<pre>
&gt;&gt;&gt; pythonObj = 'tuple', 'list', 'dict', 'set'
&gt;&gt;&gt; perlObj = 'list', 'list', 'hash', 'hash'
&gt;&gt;&gt; cppObj = 'tuple', 'vector', 'unordered_map', 'unordered_set'
&gt;&gt;&gt; mean = 'タプル', 'リスト (配列)', '辞書 (連想配列)', '集合'
&gt;&gt;&gt; for py, pl, cpp, jp in zip(pythonObj, perlObj, cppObj, mean):
...     print('Python: ' + py + ', Perl: ' + pl + ', C++: ' + cpp + \
...     '\nこれは何? - ' + jp)
... 
Python: tuple, Perl: list, C++: tuple
これは何? - タプル
Python: list, Perl: list, C++: vector
これは何? - リスト (配列)
Python: dict, Perl: hash, C++: unordered_map
これは何? - 辞書 (連想配列)
Python: set, Perl: hash, C++: unordered_set
これは何? - 集合
</pre>
<p>また、2つのシーケンスを <code>zip()</code> したものを <code>dict()</code> に食わせることで、一方をキー、他方を値とする辞書が作れる。</p>
<pre>
&gt;&gt;&gt; py2pl = dict(zip(pythonObj, perlObj))
&gt;&gt;&gt; py2pl
{'tuple': 'list', 'set': 'hash', 'dict': 'hash', 'list': 'list'}
</pre>
<h3>数列を作る <code>range()</code> 関数</h3>
<p>リストのスライスが欲しいのではなく、数の並びそのものが欲しい場合は、 <code>range()</code> 関数を使えばいい。 Perl でいうところの範囲演算子 <q><code>..</code></q> のようなもので、スライスと同様に step も指定できます。</p>
<pre>
&gt;&gt;&gt; for x, y in zip(range(0, 3), range(3, 0, -1)):
...     print("x:", x, "/ y:", y)
... 
x: 0 / y: 3
x: 1 / y: 2
x: 2 / y: 1
</pre>
<p><code>range(x, y)</code> で得られる数列の逆順が欲しい場合は、 <code>range(y, x, -1)</code> ではなく、 <code>range(y-1, x-1, -1)</code> とするか、または <code>range(x, y)[::-1]</code> とする必要があります。</p>
<pre>
&gt;&gt;&gt; list(range(0, 3))
[0, 1, 2]
&gt;&gt;&gt; list(range(3, 0, -1))
[3, 2, 1]
&gt;&gt;&gt; list(range(2, -1, -1))
[2, 1, 0]
&gt;&gt;&gt; range(0, 3)[::-1]
range(2, -1, -1)
</pre>
<p>range にスライスを指定するとリストではなく新たな range を生成するのは面白い特性ですね。</p>
<pre>
&gt;&gt;&gt; range(0 ,100, 3)[10:20]
range(30, 60, 3)
&gt;&gt;&gt; range(0 ,100, 3)[30:10:-5]
range(90, 30, -15)
&gt;&gt;&gt; range(0 ,10, 3)[30:10:-5]
range(9, 9, -15)
&gt;&gt;&gt; range(0 ,50, 3)[30:10:-5]
range(48, 30, -15)
</pre>
<p>…といった感じになるらしいです。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2017/02/25/python-learning-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python習得中 &#8211; その3</title>
		<link>https://blog.harapeko.jp/2017/02/24/python-learning-3/</link>
		<comments>https://blog.harapeko.jp/2017/02/24/python-learning-3/#comments</comments>
		<pubDate>Thu, 23 Feb 2017 15:48:26 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=391</guid>
		<description><![CDATA[3章まで読了。データ構造を表す型が何気に豊富ですね…。 リストをコピーする方法が 3通りもある 意外と自由度高 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>3章まで読了。データ構造を表す型が何気に豊富ですね…。</p>
<p><span id="more-391"></span></p>
<h3>リストをコピーする方法が 3通りもある</h3>
<p>意外と自由度高いな…。</p>
<pre>
&gt;&gt;&gt; a = [1, 2, 3]
&gt;&gt;&gt; b = a.copy()
&gt;&gt;&gt; c = list(a)
&gt;&gt;&gt; d = a[:]
&gt;&gt;&gt; a[0] = 'hoge'
&gt;&gt;&gt; a
['hoge', 2, 3]
&gt;&gt;&gt; b
[1, 2, 3]
&gt;&gt;&gt; c
[1, 2, 3]
&gt;&gt;&gt; d
[1, 2, 3]
</pre>
<p>見た目だけなら <code>d</code> のやり方が一番好きだけど、パフォーマンス的にはどれが一番マシなんだろう…?</p>
<p>ちなみに辞書のコピーは 3.4.12 節では <code>copy()</code> メソッドによる方法しか示されていなかったが、少なくとも <code>dict()</code> コンストラクタを使う方法は同様にイケるっぽい。</p>
<h3>Python ではリストとタプルは別物である</h3>
<p>Perl で慣れてるのでこういう表現になります。</p>
<p>Perl では値をカンマで区切ったものは何でもリストになります。 Python では値をカンマで区切ったものはタプルとなり、要素の追加・削除・変更ができません。</p>
<p>局面に応じて値の並びをミュータブルに扱いたいかイミュータブルに扱いたいかを選べるようになっているのは良いことだと思います。そうなっていることで不便を感じることも多分無いと思います。 Perl のリストの仕組みに不便を感じたことはありませんが。</p>
<p>強いて言えば値 1個だけのタプルの書き方がちょっとキモイですね…。</p>
<pre>
&gt;&gt;&gt; (1)
1
&gt;&gt;&gt; 1,
(1,)
</pre>
<p>Perl みたいに丸かっこで括ったらリスト、じゃないやタプルとして扱われる、でも良かった気もしますが…</p>
<p>ただ、C++ や C# などでライブラリに存在するタプルオブジェクトなんかに比べれば、これが本来タプルに求められるべき使い勝手なんだろうな、という気はします…(´・ω・`)。</p>
<h3><code>dict</code> コンストラクタ</h3>
<p>2要素のタプルのタプルからでも生成できるみたいだけど、引数にタプルのリテラルを指定する場合はカッコをいっぱい挟まないといけない模様…(´・ω・`)</p>
<pre>
&gt;&gt;&gt; dict(1, 2, 3, 4, 5, 6)
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
TypeError: dict expected at most 1 arguments, got 6
&gt;&gt;&gt; dict((1, 2), (3, 4), (5, 6))
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
TypeError: dict expected at most 1 arguments, got 3
&gt;&gt;&gt; dict(((1, 2), (3, 4), (5, 6)))
{1: 2, 3: 4, 5: 6}
</pre>
<p><code>dict</code> コンストラクタに指定できる引数の数が 1つだけなので、まぁ当然っちゃ当然ですが… 素直に <q><code>{</code> 〜 <code>}</code></q> 使えってことですね。</p>
<h3><code>dict_keys</code> はそのまま <code>sorted</code> に渡せる</h3>
<p>辞書の <code>keys()</code> メソッドは <code>dict_keys</code> オブジェクトを返す。リストとして扱うには <code>list()</code> コンストラクタに渡す必要があるが、ソートしたキーの一覧が必要な場合はそのまま <code>sorted()</code> 関数に渡せばいいっぽい。</p>
<pre>
&gt;&gt;&gt; da = { 'hoge': 'foo', 'fuga': 'bar', 'piyo': 'baz', 'piyopiyo': 'qux' }
&gt;&gt;&gt; da.keys()
dict_keys(['hoge', 'piyo', 'piyopiyo', 'fuga'])
&gt;&gt;&gt; list(da.keys())
['hoge', 'piyo', 'piyopiyo', 'fuga']
&gt;&gt;&gt; sorted(da.keys())
['fuga', 'hoge', 'piyo', 'piyopiyo']
</pre>
<h3>辞書のキーの集合を得るなら <code>keys()</code> メソッドの呼び出しも不要</h3>
<p>これは 3.5.2 節に記載の通り。集合は <code>for</code> ループで回すこともできるので、普通の用途ならそもそもリストにする必要はないってことだやね。</p>
<pre>
&gt;&gt;&gt; da = {'hoge': 'foo', 'fuga': 'bar', 'piyo': 'baz', 'piyopiyo': 'qux'}
&gt;&gt;&gt; set(da)
{'hoge', 'piyopiyo', 'fuga', 'piyo'}
&gt;&gt;&gt; for a in set(da):
...     print(a)
... 
hoge
piyopiyo
fuga
piyo
</pre>
<p>本当に <code>for</code> ループで回すだけなら <code>keys()</code> が返す <code>dict_keys</code> でもイケるようですが。</p>
<pre>
&gt;&gt;&gt; for a in da.keys():
...     print(a)
... 
hoge
piyo
piyopiyo
fuga
</pre>
<p>集合の使い勝手はむしろ集合同士の比較演算にあるようです。 (3.5.4 節)</p>
<h3>辞書はキーにタプルが使える</h3>
<p>タプルとそれ以外との混在も可能っぽい。</p>
<pre>
&gt;&gt;&gt; da = {'foo': 1, 'bar': 2, ('foo', 'bar'): 3, 'baz': 4, ('foo', 'baz'): 5}
&gt;&gt;&gt; da
{'bar': 2, 'baz': 4, ('foo', 'bar'): 3, 'foo': 1, ('foo', 'baz'): 5}
&gt;&gt;&gt; da['foo', 'bar']
3
</pre>
<p>DBMS でも 2つのカラムが PK になる場合とかありうるので、データ構造が無駄に複雑にならなくて済む場合もあってよさそう。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2017/02/24/python-learning-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python習得中 &#8211; その2</title>
		<link>https://blog.harapeko.jp/2017/02/22/python-learning-2/</link>
		<comments>https://blog.harapeko.jp/2017/02/22/python-learning-2/#comments</comments>
		<pubDate>Wed, 22 Feb 2017 03:11:49 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=389</guid>
		<description><![CDATA[Python 習得中です。今日は 3章の 3.2.16 まで。 list コンストラクタに文字列を渡すと一文字 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Python 習得中です。今日は 3章の 3.2.16 まで。</p>
<p><span id="more-389"></span></p>
<h3><code>list</code> コンストラクタに文字列を渡すと一文字ずつに分解してリスト化する</h3>
<pre>
&gt;&gt;&gt; list('cat')
['c', 'a', 't']
</pre>
<p>率直に言って気持ち悪いですね(´・ω・`)</p>
<p>タプルも同じですか。</p>
<pre>
&gt;&gt;&gt; tuple('cat')
('c', 'a', 't')
</pre>
<p>素直に <q><code>[</code>〜<code>]</code></q> とか <q><code>(</code>〜<code>)</code></q> とか使えって話ですね。</p>
<h3><code>[0]</code> はいくつでも重ねられる</h3>
<p>リストのリストをいじっていて気づいたのですが、</p>
<pre>
&gt;&gt;&gt; arr = [['foo', 'bar', 'baz'], ['hoge', 'fuga', 'piyo'], [1, 2, 3]]
&gt;&gt;&gt; arr[0]
['foo', 'bar', 'baz']
&gt;&gt;&gt; arr[0][0]
'foo'
&gt;&gt;&gt; arr[0][0][0]
'f'
</pre>
<p>ここまではわかるのですが、</p>
<pre>
&gt;&gt;&gt; arr[0][0][0][0]
'f'
</pre>
<p>あ、これできちゃうんだ、と。</p>
<p>確かに、文字列のオフセット位置を指定して抽出した文字も型としては同じ <code>str</code> 型なので当然と言えば当然なのですが、なんだかもにょる…(´・ω・`)</p>
<h3>リストから同値の要素を除去する <code>remove()</code> メソッドの挙動</h3>
<p>リストの先頭から検索して最初に hit した要素を削除する。 hit するものがないと<strong>エラーになる</strong>。</p>
<pre>
&gt;&gt;&gt; arr = ['foo', 'bar', 'baz', 'bar', 'qux', 'quux']
&gt;&gt;&gt; arr
['foo', 'bar', 'baz', 'bar', 'qux', 'quux']
&gt;&gt;&gt; arr.remove('bar')
&gt;&gt;&gt; arr
['foo', 'baz', 'bar', 'qux', 'quux']
&gt;&gt;&gt; arr.remove('bar')
&gt;&gt;&gt; arr
['foo', 'baz', 'qux', 'quux']
&gt;&gt;&gt; arr.remove('bar')
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
ValueError: list.remove(x): x not in list
</pre>
<p>…使いみちあるの? これ(´・ω・`)</p>
<p><code>index()</code> メソッドも hit しないとエラーになる。先に <code>in</code> 演算子でテストしておかないとダメってことやね。</p>
<pre>
&gt;&gt;&gt; arr = ['foo', 'bar', 'baz', 'bar', 'qux', 'quux']
&gt;&gt;&gt; arr.index('bar')
1
&gt;&gt;&gt; arr.remove('bar')
&gt;&gt;&gt; arr
['foo', 'baz', 'bar', 'qux', 'quux']
&gt;&gt;&gt; arr.index('bar')
2
&gt;&gt;&gt; arr.remove('bar')
&gt;&gt;&gt; arr
['foo', 'baz', 'qux', 'quux']
&gt;&gt;&gt; arr.index('bar')
Traceback (most recent call last):
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;
ValueError: 'bar' is not in list
</pre>
<h3><code>==</code> 演算子でリストの内容を比較できちゃう?</h3>
<p><code>join()</code> メソッドに関するサンプルを試していて思ったのですが…</p>
<pre>
&gt;&gt;&gt; arr = ['foo', 'bar', 'baz']
&gt;&gt;&gt; sep = ':'
&gt;&gt;&gt; joined = sep.join(arr)
&gt;&gt;&gt; joined
'foo:bar:baz'
&gt;&gt;&gt; separated = joined.split(sep)
&gt;&gt;&gt; separated
['foo', 'bar', 'baz']
&gt;&gt;&gt; separated == arr
True
</pre>
<p>ものすごく当たり前のことのように配列同士で比較が行われていてすげぇーってなりました…。</p>
<pre>
&gt;&gt;&gt; arr1 = ['foo', 'bar', 'baz']
&gt;&gt;&gt; arr2 = ['foo', 'bar', 'baz']
&gt;&gt;&gt; arr1 == arr2
True
&gt;&gt;&gt; arr1 = [['foo', 'bar', 'baz'], ['hoge', 'fuga', 'piyo']]
&gt;&gt;&gt; arr2 = [['foo', 'bar', 'baz'], ['hoge', 'fuga', 'piyo']]
&gt;&gt;&gt; arr1 == arr2
True
&gt;&gt;&gt; arr3 = [['foo', 'bar', 'baz'], ['hoge', 'fuga', 'poyo']] #ちょこっと違う
&gt;&gt;&gt; arr1 == arr3
False
</pre>
<p>階層深くしてもちゃんと比較してくれてますね…。</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2017/02/22/python-learning-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python 習得中 &#8211; その1</title>
		<link>https://blog.harapeko.jp/2017/02/21/python-learning/</link>
		<comments>https://blog.harapeko.jp/2017/02/21/python-learning/#comments</comments>
		<pubDate>Tue, 21 Feb 2017 14:33:28 +0000</pubDate>
		<dc:creator><![CDATA[村山 俊之]]></dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.harapeko.jp/?p=386</guid>
		<description><![CDATA[新しい現場で Python を使う仕事があるということなので、オライリーの入門 Python 3 の電子書籍版 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>新しい現場で Python を使う仕事があるということなので、オライリーの<a href="https://www.oreilly.co.jp/books/9784873117386/">入門 Python 3</a> の電子書籍版を購入して予習しています。とりあえず 2章まで読みました。</p>
<p>履修した中で気づいたことなどをちらほらとメモってみることにします。</p>
<p><span id="more-386"></span></p>
<h3><code>/</code> は浮動小数点数の演算になる</h3>
<p>演算子の左右が整数であっても、評価結果は必ず浮動小数点数になる。</p>
<p>整数の割り算を行いたい場合は <code>//</code> を使用する。</p>
<pre>
&gt;&gt;&gt; 9 / 4
2.25
&gt;&gt;&gt; 9 // 4
2
</pre>
<h3>整数型はサイズの制限がない</h3>
<p>Python3 では <code>long</code> 型が廃止され、 <code>int</code> 型は際限なく大きい値を取り扱えるようになっている。オーバーフロー例外は起こりえない。</p>
<p>面白いけど、 DBMS で取り扱われる整数だってサイズ制限はあるし、そこまでメリットあるのかなぁ…? 効率面との兼ね合いとかもどう折り合いをつけているんだろう? (ソースコード嫁&gt;ヲレ)</p>
<h3>スライスはステップも指定できる</h3>
<p><q><i>begin</i><code>:</code><i>end</i><code>:</code><i>step</i></q>、という構文。</p>
<p>文字列に対してもスライスを適用することができて、文字列を逆さにしたい場合はステップを -1 にしてやればいい。</p>
<pre>
&gt;&gt;&gt; alpha = 'abcdefghijklmnopqrstuvwxyz'
&gt;&gt;&gt; alpha[::-1]
'zyxwvutsrqponmlkjihgfedcba'
</pre>
]]></content:encoded>
			<wfw:commentRss>https://blog.harapeko.jp/2017/02/21/python-learning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
