LoginSignup
21
23

More than 5 years have passed since last update.

JavaプログラマがPythonを勉強してみた。(型について)

Last updated at Posted at 2018-06-05

Javaでの投稿ネタが尽きたので、勢いでPythonの勉強を始めたJavaプログラマです。
前回のif,for,while文の勉強記事はこちら。

思いつきで前回投稿したのですが、過去最大数のいいね!をいただきました。
(トレンドと比べると月とスッポンですが…)
Pythonはやっぱり流行りなんだなぁと実感。

いいね!をもらえたことでテンションが上がり、
始まりはゴミみたいな理由だったけど、Pythonを真面目に勉強しよう!
それならPythonの参考書を書こう!
と思っている今日この頃。

でも、「やはり初心者向けか、思い切ってデータ分析がいいか、それともWeb開発がいいか、画像解析も捨てがたい…」
と悩んでいるので、とりあえず今は色々な入門サイトを参考にしながら、基礎中の基礎をお勉強します。

参考サイト

動作確認環境

  • java 1.8.0
  • Python 3.5.2

PHPとかちゃんと勉強した人なら苦労しないでしょうが、古臭いJava脳に、型宣言なしはツライもんです。
「パッと見て型分からん。。うぅっ。。」ってなります。
というわけで今回は型について勉強してみた。(どういうわけだ

Pythonでは、大きく分けて6種類の型(タイプ?)があるらしい。

  1. 数値
  2. 文字列
  3. リスト
  4. セット
  5. タプル
  6. ディクショナリ

なにやら馴染みのないものが2つくらいあります。
タプルとディクショナリってなんですか?
タプルとか聞いたことすらない…
ディクショナリは直訳すると辞書だけど、辞書型ってなんだ…

一旦おいておいて、とりあえず上から順にJavaと比較しながら勉強していきます。

数値

Pythonにおける数値型は以下の3つ。

  1. 整数(int)
  2. 長整数(long)
  3. 浮動小数点数(float)

どれもJavaで見たことあるので一安心。

int

Javaだと、

IntDemo.java
int num1 = 1234; // 10進数
int num2 = 0b10011010010; // 2進数
int num3 = 02322; // 8進数
int num4 = 0x4D2; // 16進数

Pythonでは、

IntDemo.py
num1 = 1234 # 10進数
num2 = 0b10011010010 # 2進数
num3 = 0o2322 # 8進数
num4 = 0x4D2 # 16進数

JavaもPythonも上から順に出力させてみると、

1234
1234
1234
1234

8進数が「0」か「0o」の小さな違いだけでした。
今のところ順調です。

long

続きましてlongです。
Javaだと、

LongDemo.java
long l = 9223372036854775807L;

Pythonも同じように書いてみる。

LongDemo.py
l = 9223372036854775807L

ん?なんかエラーが出ているぞ?

SyntaxError: invalid syntax

なんでやねん!
末尾にLつけるだけじゃないかい!
と、激オコしながら参考サイトを良く読むと、

Python 3 では、整数(int) と長整数(long)は統合され、すべて整数(int)として扱われるようになり、L や l も廃止されました。

\(^o^)/
上のやつはPython 2の書き方でした。
Python 3にはlongはないそうです。
参考サイトはよく読みましょう!!!!(ごめんなさい

そしてまだ重要なことが、、、

長整数は、メモリが許す限り桁数に制限はなく、長整数同士の演算では計算誤差も生じません。

ということで、メモリが許す限り何桁でもOKらしい。

LongDemo2.py
num = 1234567890123456789012345678901234567890123456789012345678901234567890
print(num)

がちゃんと出力されました。

桁あふれに怯えなくていいなんて…Pythonすごすぎ…

float

Javaでは、doubleのほうが有効桁数が多いので、floatを使うことはありません。
下のようになります。

FloatDemo.java
float f = 1.2345f;

Pythonだと、

FloatDemo.py
f = 1.2345

出力してみる。

1.2345

普通でした。
最大桁数はシステムに依存するとのことです。
Javaのdouble = Pythonのfloatという認識で問題なさそうです。

文字列

続きまして文字列。

StrDemo.java
String str1 = "文字列";
// 上と同じ
String str2 = new String("文字列");

Pythonの場合も、細かい動きまでは調べられていませんが、下のように書く。

StrDemo.py
str1 = "文字列"
str2 = '文字列'

囲い文字は、シングルクォーテーションでもダブルクォーテーションでも良いらしいです。
QiitaとGitHubを見た限り、シングルクォーテーションを使用している方が多いような印象でした。
(Java脳は、ついダブルクォーテーションを使いたくなりますが…)

ちなみにプラス記号を使用すると、文字列連結できます。

StrDemo2.py
str3 = "文字列" + "連結!"

リスト

名前から想像するに、他プログラミング言語でいう配列みたいなものでしょうか?
という予想から、まずJavaで配列を書いてみる。

ListDemo.java
int foo[] = [1, 2, 3, 4, 5];

これをPythonにすると

ListDemo.py
foo = [1, 2, 3, 4, 5]

要素の追加、挿入、変更、削除などの機能はもちろんあります。
動きは省略しますが、まとめてみました。

機能 使い方
追加 foo.append(6) # 末尾に6を追加
挿入 foo.insert(5, 6) # リストの5番目の後に6を挿入
変更 foo[5] = 6 # リストの5番目を6に変更

削除は、自分が調べた限り4種類ありました。

削除機能 使い方
全要素を削除 foo.clear()
指定した位置の要素を削除 foo.pop(1)
指定した値と同じ要素を削除 foo.remove("A")
位置と範囲を指定して削除 del foo[:3] # 前にある3つの要素を削除

めんどくさかったので調査をサボりましたが、delは、メソッドではなく「del文」という構文らしい。
「変数やオブジェクトを削除する構文」とだけ覚えて、いまは次にいきます。

ディクショナリ

直訳すると辞書だけど、辞書型ってなんだ…
tohohoの参考サイトの該当ページには、以下のように書いてあります。

{...} は、辞書(dict)と呼ばれるキーと値のペアのリストを保持します。

JavaでいうとMapみたいなものでしょうか??
Pythonのサンプルコードは、tohohoの参考サイトをそのまま拝借しました。

DictDemo.py
d = {'Yamada': 30, 'Suzuki': 40, 'Tanaka': 80}

今までとは順番逆ですが、これをJavaにすると

MapDemo.java
Map<String, Integer> d = new HashMap<String, Integer>();
d.put("Yamada", 30);
d.put("Suzuki", 40);
d.put("Tanaka", 80);

Javaは、どんな形であれput()メソッドを使用しないと値をセットできないです。
Javaに比べてPythonは、かなりシンプルに書けますね。
Javaほんと無能
Pythonの辞書型 = JavaのMapと覚えましょう。
あとディクショナリではなく、辞書型って呼び方のほうが多いようです。

タプル

もはや聞いたことすらありません。
はじめに「タプル」でGoogle検索!
Wikipediaに「タプル」のページがありました。

タプルまたはチュープル(英: tuple)とは、複数の構成要素からなる組を総称する一般概念。
数学や計算機科学などでは通常、順序付けられた対象の並びを表すために用いられる。個別的には、n 個でできた組を英語で「n-tuple」と書き、日本語に訳す場合は通常「n 組」としている。タプルの概念そのものも組と呼ばれる場合がある。なお、 n-tuple は数学のタプルを意味するほか、同様に double、triple などの拡張として倍数詞の表現にも利用される

_〆(-∧-;)ん~・・・ ワカラナイィ・・・・・・・・。
算数もできないバカのお前は「Pythonを勉強するな!」って言われている気分です。(勉強するけど

すみません。本題です。

今度はPythonWebより抜粋させていただきました。

タプル型は文字列やリスト型と同じくシーケンス型の一つです。複数の要素から構成され、要素が順に並んでいるものになります。特にリスト型とは共通している部分が多いのですが、タプルでは一度作成されたオブジェクトの要素を変更できません。またタプルにはメソッドが用意されていません

Javaで表現すると、final変数の配列(リスト)バージョンといったところでしょうか??

実際に書いてみると、下のようになります。

TapleDemo.py
tuple = (2005, 2006, 2007, 2008)

どうやら変更ができないので、リストより実行速度が少し早いらしい。
値を変更する予定がなければタプルを使う。それ以外はリストを使うという感じなのでしょう。

ちなみに値が1つしか持たないタプルを定義する場合は、

TapleDemo2.py
tuple = (2005, )

と、最後にカンマを書く必要があるらしい。

おまけ

Pythonについて調べていて「へぇ~_〆(・∀・*)」と思ったことを書いています。
タイトルに困ったので、とりあえず「おまけ」で。

Pythonにおける定数

Pythonには、定数という概念がない。
なので、大文字とアンダーバーで構成されている変数名を定数とするのが慣例らしい。
PEP8 に書いていました。(Google翻訳ほんと優秀

value = 1 # 可変の変数
VALUE = 1 # 定数として扱う
VALUE_MAX = 10 # 定数として扱う

文字列の型

Python 3系の場合は、文字列はunicode。
ちなみに2系だと、unicodeとstrの2種類らしい。

数字から始まる変数名は使えない

タイトル通り。123はダメで、hensu123はOKとのこと。

コメントで教えていただいたこと

カンマがあれば括弧がなくてもタプルになる

value = 1, 2, 3
print(value)
print(1, 2, 3)
print((1, 2, 3))

実行結果は、

(1, 2, 3)
1 2 3
(1, 2, 3)

タプルになりました。
Java脳ではスッキリしすぎてて違和感ありますが、入力文字数をへらすことができるのでいいですね。

タプルは辞書のキーに使える

タプルは不変オブジェクトなので、辞書のキーにも使えるとのことです。
また、括弧がなくてもいいので、XY座標指定のように使うこともできるらしいです。

>>> a = {}
>>> a[(1, 2)] = 'abc'
>>> a
{(1, 2): 'abc'}
>>> a[1, 2]
'abc'

このあたりが機械学習等の統計学に役立つんでしょうか。
数学なんて忘れてしまった自分には分かりませんが…

Pythonはすべての値がオブジェクト

Pythonはすべての値がオブジェクトとのこと。
どういうことかというと、Javaでいうプリミティブ型と参照型があるが、Pythonは全てがJavaでいう参照型みたいな感じらしいです。
なので、Pythonは数値なのにメソッドを持っているとのこと。すごい(小並感)
以下、コメントより抜粋させていただきました。

>>> dir(-5)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> (-5).__abs__()
5

dirは見ての通り、メソッド一覧を取得するものらしいです。
absは絶対値を取得するメソッドのようです。

やってみての感想

リストとディクショナリ(辞書型)とタプルの使い方が混乱しそう。
と思ったので、表にしてみた。

削除機能 使い方
リスト []で囲む
ディクショナリ(辞書型) {}で囲む
タプル ()で囲む ※囲まなくてもカンマがあればOK

自分も間違えましたが、Python2系と3系で構文や使用可能なライブラリが結構違うようです。
今から勉強を始める方は、参考文献、参考サイトのバージョンをしっかり確認しましょう。

21
23
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
23