はじめてのPython、調べたことはメモっとく。
当方の経験言語は、ActionScript3、C、C++、C#、JS。
import
socket
通信周りを扱えるようになる。
Pythonによる通信処理
17.2. socket — 低レベルネットワークインターフェース
Man page of SOCKET
socket.socket()
ソケットの作成。
socket.setsockopt()
ソケットのオプションを設定。
socket.SOL_SOCKET
ソケットレベル?どのソケットの場合でも、とりあえずこれを指定するぽい
socket.SO_BROADCAST
ブロードキャスト設定。
socket.AF_INET
IPv4 インターネットプロトコル
socket.SOCK_DGRAM
データグラム (コネクションレス、信頼性無し、固定最大長メッセージ) をサポートする。
UDP通信ではコレを指定する。
random
乱数の関数を扱えるようになる。
数値(ランダムな値)の生成
RPi.PGIO
RasPiでLチカしようとしたときに見つけた文。
as は別名を名付けするためのもの。
import RPi.GPIO as GPIO
Pythonのモジュールインポートのしくみ
Raspberry PiでPythonのRPi.GPIOを使ってLチカする
インデント必須
これはよいかも。
コンソールへの出力。
ダブルクォーテーションとシングルクォーテーションでの文字列の表示には差異はないのか?
print "bufferSize : " + size
的な感じで出力しようとすると、
TypeError: cannot concatenate 'str' and 'int' objects
と、「型を混ぜるんじゃねぇ」と怒られる。
print "bufferSize : " + str(size)
キャストしてあげるとOK。
か、
print "bufferSize : "
print size
それぞれ出す。
すこしめんどい。
セミコロン不要
いれてもよい。
Terminalでのヴァージョンの確認
$ python --version
python 2系と3系ではだいぶ違う感じか?
型指定不要
動的型付けしてくれる。
文字列に代入
msg = "%s:%s" % (1, 100) # 1:100
関数 def
def文で関数(functino)を定義することが出来る。
def add(x,y):
ans = x + y
return ans
n = add(3, 5)
print n # 8
はー、インデントが強制だから中括弧とかは不要になるのか。
リスト、タプル、ディクショナリ
- リスト
- [ ] (角括弧)
- いわゆる配列。
- タプル
- ( ) (括弧)
- 変更できない配列。
- ディクショナリ
- { } (中括弧)
- 連想配列。
Python入門 - リスト・タプル・辞書
【python】基礎を復習 (リスト, タプル, ディクショナリ)
Nullオブジェクトは None
# ↓正解
A is None
A is not None
# ↓不正解、遅いらしい
A == None
PythonではNoneの比較は==ではなくisを使う
Pythonでヌルオブジェクトの比較
elif
Pythonではelse ifをelifと書くのかw
日本語エンコード
日本語コメントアウトでもASCII以外のキャラクタがはいっていると怒られるので、ファイルの頭にエンコーディングの指定をしてやると日本語でも言う事聞いてくれる。
# coding=utf-8
in演算子
指定の値が要素に含まれているかどうかを調べる。
list = ["A", "B", "C"]
print "B" in list # True
print "D" in list # False
print "B" not in list # False
print "D" not in list # True
要素の確認(in演算子, indexメソッド, countメソッド)
lambda
ラムダ式。Pythonの無名関数。
def func(a, b):
return a + b
print func(1, 2) # 3
上記をlambdaを使うと、
print (lambda a, b: a + b)(1, 2) # 3
で、変数に格納することもできると。へー。
f = (lambda a, b: a + b)
print f(1, 2) # 3
reduce 関数
複数の要素を1つにまとめたいときに使う。
具体的には,配列の先頭から 2 つの要素を取り出して処理を行い,次はその結果とその次の要素に処理を行う,ということを繰り返す。
print reduce(lambda x, y: x + y, range(1, 5)) # 10
Python3だとimportが必要とのこと。
test.pyはメッ
ちょっと試すのに完全にこれやってたw
testていう標準ライブラリがあるから。
Pythonでtest.pyを作るな!
[ctrl] + [c] をキャッチする
RapPiでPythonプログラム終了時にGPIOからのLED光りっぱなしとかが気になったので[ctrl] + [c]をキャッチして終了処理を書いた。
try:
while True:
# ここに通常処理
except KeyboardInterrupt:
print("interrupted!")
# ここに終了処理
pass 文
何もしない。中身の無い関数やクラスを作成する際に使用されます。
そんなんあんのか。
def func()
pass
サーバを建てる
「Python、楽しい!」ってなって、何できるかなーと調べてたけどサーバが簡単に立ち上がるのすぎょい。
$ python -m SimpleHTTPServer
Pythonならたった一行でWebサーバを建てられる
PythonでWebアプリをつくる(ApacheもWebフレームワークもなしで)
for 文
こんな書き方おらはじめてだ。
for 整数 in オブジェクト:
処理
オブジェクトに配列をいれれば順番に実行してくれる。
list = [1,2,3]
for num in list:
print(num) # 1 2 3
オブジェクトにrange関数を指定すればそれに従って実行。
for num in range(5):
print(num) # 0 1 2 3 4
0から始まって5回実行してくれる、って意味っすね。
range関数の引数の数によって挙動も変わる。
- range(5)
- 出力:0 1 2 3 4
- 0からインクリメントしながら5回実行
- range(5, 10)
- 出力:5 6 7 8 9
- 5からインクリメントしながら10未満まで実行
- range(0, 10, 3)
- 出力:0 3 6 9
- 0から10未満まで、3ずつ増加しながら実行
python for文を初心者向けに解説!for文基礎はこれで完璧
if 文
こう書くのね。
Pythonは基本的に文中の括弧を極力書かないようにしてんのか。
if 条件式1:
処理
elif 条件式2:
処理
else:
処理
ブロックコメントアウト
基本的に # をつけた行コメントしかできないらしい。
クォーテーションでそのかわりとなる役割が可能。
それもシングルとダブルでネストが可能。
"""
print "hello"
'''
print "heyhey"
'''
"""
オブジェクトの識別値
Pythonの全てのオブジェクトには、それぞれ固有の「識別値(ID)」を持っている。
で、immutableなオブジェクトとmutableなオブジェクトがある。
immutableなオブジェクトはオブジェクトの値が変更されたときに同時にIDも変更になるオブジェクト。
普通の整数とか文字列とか?
mutableなオブジェクトは、反対にIDが固定のオブジェクト。Listとか。
なので以下の状態だとPythonはIDに変化がないから指すオブジェクトも同一のものという認識になるらしい。
ほー、覚えておこ。
a = [1,2,3,4,5]
# aというリストの中身をコピーしたbというリストを作った(つもり)
b = a
# 後からa[2]の値を変更した(つもり)
a[2] = 5
print(a) # [1, 2, 5, 4, 5]
print(b) # [1, 2, 5, 4, 5]
多次元配列
Pythonでは多次元配列を実現しようとするとき、
- 多重リスト
- NumPy 配列
の2つがあるらしい。
NumPyが静的で高速なので、こっち使ってみよう。
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print a
# [[1 2 3]
# [4 5 6]]
クラス
class Spam:
val = 100
def ham(self):
self.egg('call method')
def egg(self, msg):
print("{0}".format(msg))
print(("{0}".format(self.val))
spam = Spam()
spam.ham()
# --- output ---
# call method
# 100
なんじゃい、self。
Pythonではメソッドは最低1つの引数を持ちます。この最初の引数は必ずselfという名前にする慣例があります。
なるほど。
format関数
文字列への変数の埋め込みに使われる。
'任意の文字列{}任意の文字列'.format(変数)
引数で指定、もできる
apple = 50
orange = 100
total = apple + orange
print('りんご:{0}円 みかん:{1}円 合計:{2}円'.format(apple, orange, total))
# --- output ---
# りんご:50円 みかん:100円 合計:150円
関数の戻り値が複数の時
タプルでもらって、そのまま要素を呼び出せば値が使える。
あんまりこんな書き方したことないから新鮮だな。
def tasu(x):
a = x + 1
str = "data : "
return (str, a)
(n, m) = tasu(1)
print n
print m
# --- output ---
# data :
# 2
数値の末尾の"L"
RECVMSG = 0x00000021L
どっかのサンプルコードを見てたら16進数のあとに"L"がついていてなんじゃこりゃとおもった。
これは「長整数」といって、整数と同じだが扱える桁数の限度がなくなる、とのこと。
つけずに桁数オーバーしても勝手に長進数に変換される。
16進数は先頭に"0x"、8進数は"0"をつけるとそう扱われる。
どちらもprintすると10進数で出力される。
【ラズパイ】喋らす
OpenJTalkを入れてみた。
音声合成をする方法(Open JTalk)
漢字もいけた。
そこそこ自然な発話だけど、機械がしゃべる分にはSF感が足りないから使わないかも。
Python楽しい!!!!!