Pythonの勉強がてら「しがない問題」を解いた話とか

この記事の続きです。

kdnakt.hatenablog.com

 

[Pythonのお勉強]

ちょっとPythonを書く用事が出来たので、基本的な文法のおさらいの為にPython「しがない問題」を解いてみた。

最近、React Nativeのプランクアプリの開発も5月病の所為で進んでないので、趣味開発のリハビリ的な意味も込めて。

 

さらっとできるかなと思っていたら、自分がアホなのか、酔っ払った状態でスタートしたのがよくなかったのか、そもそもPythonの日本語文字列処理が難しいのか、色々調べながら計2日近くかかってしまった。

 

リポジトリはこちら。 

github.com


元ネタはこちら。

tbpgr.hatenablog.com

 

自分の他にも解いた人がいたみたい。

nekotheshadow.hatenablog.com

 

[Pythonの文字列処理は難しい]

そもそも"文字列"'文字列'の両方が文字列だってのがJavaメインで使ってる身からするとツラい。まあどっちも動くってのはいい面もあるんだけど、無駄な宗教論争も発生しうるので個人的にはあまり好きじゃない。

 

ともかく実装を始めてみた。

import random

params = u"しくてがない"
print(params)

 

とりあえずこれでええやろ、と思ったら 

SyntaxError: Non-ASCII character '\xe3' in file shiganai.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 

この仕打ち。SyntaxErrorとな。

 

Python初心者なので文法なんて知らんがな、と思いながらググる

 

この辺りが参考になりそう。

python.keicode.com

 

修正してみる。

# coding: utf-8

import random

params = u"しくてがない"
print(params)

 

実行するとうまくいった。

f:id:kidani_a:20180421173030p:plain

 

確かに、JavaMavenプロジェクトの場合はpom.xml<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>とか書くしな。そんなもんか。

 

[文字列をランダムにシャッフルする]

この辺は最初から諦めてググる

 

Stack Overflowに良さげな回答があったのでこちらを利用する。

stackoverflow.com

 

とりあえず続きでそれっぽい感じに書いてみる。 

print(''.join(random.sample(params, len(params))))

 

良さそう。

f:id:kidani_a:20180421173811p:plain

 

あとは適当に先頭の4文字を取り出してしがない判定をして仕様通りの文字列にしていくだけだ。

 

[Pythonの否定演算子はnot]

JavaJavaScriptも否定演算子は「!」だから、そのノリで書いたら動かなくてショック。

 

    if !result:

で実行してみるとまたもやSyntaxErrorですよ。

f:id:kidani_a:20180421171107p:plain

 

さっとググって修正版。 

    if not result:

で、実行してみる。

f:id:kidani_a:20180421171513p:plain

外れた。動いたけどショック。

 

[まとめ]

  • 日本語文字列をソース中に書く場合はファイル先頭でエンコードを指定する(# coding: utf-8
  • randomを使うと文字列をシャッフルできる 
  • 否定演算子はnot

 

取り上げた内容はめちゃくちゃ基本中の基本な気もしないでもないが、自分のPython経験なんてAWS Lambda用にさらっとサンプルいじったようなものを書いたのと、Udacityでsklearn使ってちょっと機械学習触った程度なんで、一から書いてみると色々足りない部分が補えてよかった。

 

そういえば、結局最初のご用事はどこかへ行ってしまって、今のところPythonの出番はなくなってしまった。まあそのうち使うこともあるでしょ。

 

今日のブログ執筆BGMはこちら。

www.youtube.com