Rubyの配列操作をPythonで書くと?
こんにちは
最近rubyで書いたりpythonで書いたりを繰り返しており、頭の中がごちゃごちゃになりつつあります。 「この書き方pythonだとどうやるんだったっけ?」とか「あれ、これrubyの文法じゃねえpythonだ」みたいなのが増えてきたのでちょっと整理も兼ねてメモ程度に書いてみようかと思います。
部分配列
rubyの.slice
は[]
と同じ役割です。
# 宣言 pry(main)> x = (1..5).to_a => [1, 2, 3, 4, 5] # index0番から3番まで pry(main)> x[0..3] => [1, 2, 3, 4] pry(main)> x.slice(0..3) => [1, 2, 3, 4] # index1番から3個 pry(main)> x[1, 3] => [2, 3, 4] pry(main)> x.slice(1, 3) => [1, 2, 3] # index2番以降 pry(main)> x[2..-1] => [3, 4, 5]
pythonでは終了インデックスの次の数字まで指定します。
# 宣言 >>> x = range(1, 6) [1, 2, 3, 4, 5] # index0番から3番まで >>> x[0:4] [1, 2, 3, 4] # index1番から3個 >>> x[1:4] [2, 3, 4] # index2番以降 >> x[2:] [3, 4, 5]
include?
# 3が含まれているか pry(main)> x.include?(3) => true
# 3が含まれているか >>> 3 in x True
empty?
# 配列が空か pry(main)> x.empty? => false
# 配列が空か >>> len(x) == 0 False
map
# 配列内の要素を10倍にして返す pry(main)> x.map{ |item| item * 10 } => [10, 20, 30, 40, 50]
# 配列内の要素を10倍にして返す >>> map(lambda item:item*10, x) [10, 20, 30, 40, 50] # リスト内包表記 >>> [item * 10 for item in x] [10, 20, 30, 40, 50]
select
# 配列内の奇数を返す pry(main)> x.select{ |item| item % 2 != 0 } => [1, 3, 5]
# 配列内の要素を10倍にして返す >>> filter(lambda item:item%2!=0, x) [1, 3, 5] # リスト内包表記 >>> [item for item in x if (item % 2) != 0] [1, 3, 5]
Eclim機能メモ
Eclimの環境を作った時はEclimの公式サイトが死んでたので改めて,以前に書いたのも再度ここにまとめます.
:JavaNew {class | abstract | interface enum} パッケージ.ファイル名
:新規でJavaFileを作成してくれます:JavaConstructor
:コンストラクタを追加してくれます:JavaImple
:新しいウィンドウが開きimplements
などで実装しているインターフェースのメソッドが確認できます.メソッドの行でエンターを押すとそのメソッドが自動挿入されます:JavaCorrect
:エラーの出てる行の修正候補を出してくれます:JavaImportOrganize
:現在のファイルに必要なimport文を自動で挿入してくれます:JavaSearchContext
:カーソルが当たっているクラス・変数等の宣言へと飛ぶことができます:JavaCallHierarchy
:カーソルが当たっているメソッドの呼び出し階層が確認できます:JavaHierarchy
:現在開いているクラスの継承・実装関係が確認できます
Ruby風かつ高速と噂の言語Crystalを使ってみた
ちょっと興味を持ったので巷(?)で盛り上がっているCrystalを入れてみました.使ってみたというより触ってみた程度です.
Crystalとは
公式サイトによると,次のような特徴があるそうな.
インストール
githubからインストールページに飛べます.macだとHomebrewから以下のようにインストールができるみたいです.
brew tap manastech/crystal
brew update
brew install crystal-lang
Hello,world!
Crystalのファイル拡張子はcr
だそうです.
puts "Hello, crystal!"
実行結果
$ crystal hello.cr Hello, crystal!
crystaloコマンdでコンパイルと実行をやってくれるみたいですね.
crystal run ファイル名
でもできるそう.
また,コンパイルして実行ファイルを生成することもできます.Crystalの特徴はここですね.
$ crystal build hello.cr $ ./hello
各種文法
コメント
#
でコメントができます.
# This is a comment puts "Hello, crystal!" # => Hello, crystal!
以降rubyと同じところは飛ばしていきます
Integers・Float
精度指定ができる
Crystalには整数型がいくつかあり何も指定をしなければInt32
,Int64
,UInt64
から適当なのが選ばれるみたいです.後ろにi8, i16, i32, i64
などをつけることでそれぞれの精度で扱われます.iをuにすると符号なしとなります.
a = 2 b = 2_i16 c = 2_u64 puts a.class # => Int32 puts b.class # => Int32 puts c.class # => UInt64
Floatも同じです.
1.0_f32 # Float32 1_f32 # Float32
アンダースコア表記ができる
カンマの代わりに,変数をアンダースコアで繋げて書くことができます.見やすくなりますね.でもこんな大きな数使わないような
under_score_num = 111_222_333 puts under_score_num # => 111222333
Char & String
Char型はシングルクオート'
,String型はダブルクオート"
を使います.
'a' # char "abc" #string
なのでこういうことはできません.
puts 'Hello, crystal'
$ crystal hello.cr Syntax error in ./hello.cr:1: [1munterminated char literal, use double quotes for strings puts 'Hello, crystal!' ^
Array
rubyと違って,配列内の型が何であるかに気を使わなければなりません.
a = [1, 2, 3] b = [1, "Hello", 'w'] puts a.class # => Array(Int32) puts b.class# => Array((String | Int32 | Char)) x = [] of (Int32 | Char) y = Array.new(String)
最初に中身のある配列を与えた場合はcrystalで勝手に型を与えてくれますが,配列の初期化を行う際には型の宣言が必要です.
x = [] of (Int32) x << "hello" # => no overload matches 'Array(Int32)#<<' with types String
Tuple
Tuple型があります.pythonとかを使っている人には馴染みのものですね.
tuple = {1, "hello", 'x'} puts tuple # => {1, "hello", 'x'} puts tuple.class # => {Int32, String, Char} puts tuple[1] # => hello
実行速度
とまあ簡単なところを比較してみたところで,実行速度についても比較してみました.
rubyとcrystalで単にループを回しただけです.もっといい比較方法はあるよなきっと・・・.
プログラムはこんな感じ.rubyもほぼ同じような感じです.違うのは時間を呼び出すメソッドくらい.
# 比較用プログラム start_at = Time.now.to_i * 1000 + Time.now.millisecond n = ARGV[0].to_i x = 0 y = 0 n.times do |i| x += 1 y -= 1 end end_at = Time.now.to_i * 1000 + Time.now.millisecond puts x puts y puts "crystal" + "-" * 23 puts "loop: #{n}" puts "Time:#{end_at - start_at}" puts "-" * 30
実行結果
ループ回数 | ruby実行時間(msec) | crystal実行時間(msec) |
---|---|---|
100000 | 7 | 1 |
1000000 | 77 | 3 |
10000000 | 810 | 27 |
100000000 | 8102 | 349 |
速いですね. ちなみにこれは純粋にループの前後の時間のため,コンパイルの時間などを考慮してはいないです.
それと,余談ですがCrystalではコマンドライン引数は--
の後に書きます.こんな感じ.
crystal loop.cr -- 10000000
もっと色々利点や特徴があるのでしょうが,パッと比較できるのはこの程度.もう少し触ってみようかなあ.
追実験
もうちょっとましなコード?でやろうと思ってフィボナッチ数でもやってみました.コードと実験結果です.
# フィボナッチ数を求めるプログラム def fibonacci(n) if n == 0 return 0 elsif n==1 return 1 else return fibonacci(n-1) + fibonacci(n-2) end end n = ARGV[0].to_i start_at = Time.now.to_i * 1000 + Time.now.millisecond fibonacci(n) end_at = Time.now.to_i * 1000 + Time.now.millisecond puts "crystal" + "-" * 23 puts "number: #{n}" puts "Time:#{end_at - start_at}" puts "-" * 30
n番目 | ruby実行時間(msec) | crystal実行時間(msec) |
---|---|---|
10 | 0 | 0 |
20 | 1 | 0 |
30 | 180 | 11 |
40 | 26267 | 1327 |
Written with StackEdit.
Eclipseの機能をVimで使うEclimの環境をMacOSで構築する
開発のエディタはずっとVimを使っているのですが,JavaだけはEclipseで開発をしていて,もどかしさをずっと感じていました.ソースコード読むのとか,Eclipseはとっても便利なんですよね.Vrapperとか使ったりしてVimのキーバインドにはしてたんですけど,物足りない.
環境
Eclimのインストール
また,antが必要となるので,
brew install ant
またvimrcに以下を追記しBundleInstallします.
" for Java NeoBundleLazy 'ervandew/eclim', {'build': {'mac': 'ant-Declipse.home=/opt/homebrew-cask/Caskroom/eclipse-java/4.4.0/eclipse -Dvim.files='.escape(expand('~/.bundle/eclim'), '' )} } autocmd FileType java NeoBundleSource eclim
Eclimの起動
:PingEclimとしてEclimとEclipseのバージョンが帰って来れば成功です.
Eclipseプロジェクトの作成
:ProjectCreate /path/to/eclipse/project_name -n java
でEclipseプロジェクトが作成されます.
:e /path/to/eclipse/project_name/src/sample/eclim/Main.java
などとしてファイルを作成することができ,
:CProjectConfigs
によってclasspathなどの設定も行ってくれるようです.
:ProjectBuild :ProjectProblems
でプロジェクトのビルド,エラー表示などが行われます. エラー表示ではQuickfix Listというウィンドウが開かれエラーがずらっと表示されます.ちなみにこれは同期が取れているみたいで,Quickfix Listを開きながら元のソースコードを直していくと保存されるたびにエラーが減っていきます.もちろん直っていればですが.
ちなみに,エラー,または警告があると以下の6行目のようにマークがつきます.デフォルトはEclipseの警告と同じレベルなので,煩わしかったらエラー出力のレベルを変更するといいかもしれません.
Eclimの機能諸々
補完
Open Declaration(タグジャンプ)
ソース内のクラス,メソッドなどにカーソルが当たっている状態で:JavaSearchContextしてあげるとそれが宣言された箇所に飛びます.
呼び出し階層表示
:JavaCallHierarchy
としてあげると呼び出し階層が次のように表示されます.これはメソッドout()の呼び出し階層ですね.
Eclimにはまだまだ機能もあるので,適宜調べながらvimrcに使いやすいようにキーの割り当てをしていこうと思っています.
最高ですね!
参考
追記
:Java %
Blogger掲載記事
経緯
以前使っていたBloggerの記事を最初は全部移植しようと思ってたのですがめんどくさオリジナルを残しておいたほうがいいかなーと思ったので,ここにタイトル,リンク,カテゴリ(あれば)を掲載しようと思います.あ,でも今年入ってから,というか最近書いた記事はそのまんまこっちに載せちゃおうかなと考えています.
Blogger記事一覧
Android
一時時期Androidの開発に携わっていたのですが,ここの情報はもう結構古くなってしまってるかもしれません.
- Android ActionBarサポートライブラリ メニューについて
- EditTextのキーボードを表示する
- URLスキーム設定
- DialogFragmentから特定のActivityへのコールバックメソッド
- Android:SeekBarの扱い方
- AndroidでのSDカードへの画像保存
MySQL
- MySQLのデータ移行
- TreasureDataとMySQLからのインポート
- これはRailsも絡んでいますね
その他
残りは分類するほどでもなさそうなのでまとめちゃいました