JavaScript基礎(ES2015以降)
JavaScript&TypeScriptを勉強する機会があったので、JavaScript ES2015以降の文法などを自分用にまとめました。
1.1 let, constでの変数宣言
let, constの変数宣言の基本
let: 再宣言不可、再代入(上書き)可能。
const: 再宣言不可、再代入(上書き)不可。
// letで変数定義 let var1 = "var1変数"; console.log(var1); // letは上書き可能 var1 = "var1を上書き"; console.log(var1); // letは再宣言不可 let var1 = "let変数"// (ブロック スコープの変数 'var1' を再宣言することはできません。ts(2451)) // constで変数定義 const var2 = "var2変数"; console.log(var2); // constは上書き不可 var2 = "var2を上書き"//定数であるため、'var2' に代入することはできません。ts(2588)
Constで定義した変数を変更できる例
オブジェクト型と呼ばれるデータ型に関してはconstで定義された変数でも、再代入(上書き)が可能になる。
プリミティブ型
- Boolean
- Number(数値)
- BigInt(巨大数値)
- 文字列
- undefined
- null
- Symbol(一意で不変な値)
オブジェクト型
- オブジェクト({}でくくられるもの)
- 配列([]でくくられるもの)
- 関数(function)
- プリミティブ型以外の変数
1.2 テンプレート文字列
- 従来の文字列記法
文字列と変数(JavaScript)は”+”でつないでいく。
const name = "山田"; const age = 24; console.log("私の名前は" + name + "です。年齢は" + age + "歳です。");
- テンプレート文字列
`(バッククォート)で囲む。${}で囲んだ中はJavaScriptのコードが書ける。
const name = "山田"; const age = 24; console.log(`私の名前は${name}です。年齢は${age}歳です。`);
1.3 アロー関数
アロー関数は以下のfuncのように定義する。
const func = (name) => { return `こんばんは。${name}さん`; }; const App = () => { const name = "山田"; console.log(func(name)); };
アロー関数の特徴的な省略記法
- 引数が1つの場合は括弧を省略できる。
const func = name => { return `こんばんは。${name}さん`; };
- 処理を単一行で返却する場合は、中括弧とreturnを省略できる。
const func = (name) => `こんばんは。${name}さん`;
複数行の返却でも、括弧でくくってまとめて省略することもできる。
const func = (name, age) => ( { name: name, age: age, } ); const App = () => { const name = "山田"; const age = 24; console.log(func(name, age)); };
1.4 分割代入
- オブジェクトの分割代入
const myProfile = { name: "山田", age: 24, }; // オブジェクトの分割代入 const { name, age } = myProfile; console.log(`こんにちは${name}さん。年齢は${age}歳ですね。`); // 別名でのオブジェクトの分割代入 const { name: newName, age: newAge } = myProfile; console.log(`こんにちは${newName}さん。年齢は${newAge}歳ですね。`); // 順序はなんでもよい const { age: age1, name: name1 } = myProfile; console.log(`こんにちは${name1}さん。年齢は${age1}歳ですね。`);
- 配列の分割代入
const myProfile = ["山田", 24]; // 配列の分割代入 const [name, age] = myProfile; console.log(`こんにちは${name}さん。年齢は${age}歳ですね。`); // 別名での配列の分割代入 const [newName, newAge] = myProfile; console.log(`こんにちは${newName}さん。年齢は${newAge}歳ですね。`); // 順序は固定(下記の結果は"こんにちは24さん。年齢は山田歳ですね。") const [age1, name1] = myProfile; console.log(`こんにちは${name1}さん。年齢は${age1}歳ですね。`);
1.5 デフォルト値
- 引数のデフォルト値
const sayHello = (name = "ゲスト") => console.log(`こんにちは${name}さん`); // こんにちは鈴木さん sayHello("鈴木"); // こんにちはゲストさん sayHello();
オブジェクト分割代入のデフォルト値
オブジェクトにnameというプロパティがなければ、”ゲスト”がnameに代入される。
const myProfile = { name: "鈴木", age: 40, }; const { name = "ゲスト", age } = myProfile; // こんにちは鈴木さん sayHello(name);
1.6 スプレッド構文
- 要素の展開
「…」というようにでドットを3つつなげて使う。配列に対して使用することで、要素を順番に展開できる。
const sumFunc = (num1, num2) => console.log(num1 + num2); const arr1 = [10, 20]; console.log(arr1); //[10,20] console.log(...arr1); //10 20 // 普通に配列の値を渡す sumFunc(arr1[0], arr1[1]); // 30 // スプレッド構文を使って要素を展開して渡す sumFunc(...arr1); //30
- 要素をまとめる
スプレッド構文は要素をまとめるという観点でも使用できる。
const arr2 = [10, 20, 30, 40, 50]; console.log(arr2); //[10,20,30,40,50] console.log(...arr2); //10 20 30 40 50 // 分割代入で残りをまとめる const [num1, num2, ...arr3] = arr2; console.log(num1); // 10 console.log(num2); // 20
- 要素のコピー、結合
スプレッド構文がよく使われる使用例。
const arr4 = [10, 20]; const arr5 = [30, 40]; // スプレッド構文を用いて配列のコピー const arr6 = [...arr4]; console.log(arr4); // [10,20] console.log(arr6); // [10,20] // スプレッド構文を用いて配列を結合 const arr7 = [...arr4, ...arr5]; console.log(arr7); // [10,20,30,40] const obj1 = { name: "yamada", age: 24 }; const obj2 = { name: "tanaka", age: 29 }; // スプレッド構文を用いてオブジェクトのコピー const obj3 = { ...obj1 }; console.log(obj1); // {name: "yamada", age:24} console.log(obj3); // {name: "yamada", age:24}
1.7 オブジェクトの省略記法
オブジェクトのプロパティ名と設定する変数名が同一の場合は省略できる。
const name = "山田"; const age = 24; // ユーザーオブジェクト const user = { name: name, age: age, }; console.log(user);
const name = "山田"; const age = 24; // ユーザーオブジェクト(省略記法) const user = { name, age, }; console.log(user);
1.8 map, filter
map関数: 配列を順番に処理して処理した結果を配列として受け取る
const nameArr = ["山田", "鈴木", "藤井"]; // 配列の全要素に"さん"を加えた配列を作成する const nameArr2 = nameArr.map((name) => { return name + "さん"; }); console.log(nameArr2);
filter関数: returnの後に条件式を記述し、一致するもののみ返す関数
const numArr = [1, 2, 3, 4, 5]; // 数字が格納された配列から奇数のみの配列を作成する const oddArr = numArr.filter((num) => { return num % 2 === 1; }); console.log(oddArr);
- indexを扱う場合
const nameArr = ["山田", "鈴木", "藤井"]; // mapで、indexを扱う const nameArr2 = nameArr.map((name, idx) => { console.log(`${idx + 1}番目は${name}さんです。`); });
参考
現在の環境の設定ファイル(requirements.txt)
設定ファイルに現在の環境を書き込む
$ pip freeze > requirements.txt
これで作業ディレクトリのrequirements.txtファイルに、インストールしているライブラリが列挙されます。 ちなみに">"はリダイレクトといい、実行したコマンド等をファイルに直接書き込めるようです。
新たな実行環境に一括でライブラリをインストールする。
- 新たな実行環境にrequirements.txtをコピーする。
- 以下のコマンドを実行する。
$ pip install -r requirements.txt
新しい環境を構築したときや、他人に同じ環境を利用してほしいときなども使えそうですね。 では今日はこのあたりで。
Pythonでmapとラムダ式を使ってみた
今まではfor文でぶん回してたところをmapとlambdaを勉強したのでメモ。
今回は入力で与えられたリストの各要素に対して、2倍した値を出力のリストに格納する処理を様々な方法で記述。
for文での実装
# # 入力リスト input_list = [1, 2, 3, 4, 5] print('入力: ' + str(input_list)) def calc_double(x): """ 引数を2倍して返す関数 """ return x * 2 # # 出力用のリスト ans_list = [] # # リスト内の一つひとつの要素に対してcalc_doubleを適用。 # # その結果を出力用のリストに追加 for l in input_list: ans_list.append(calc_double(l)) print('出力: ' + str(ans_list))
mapを使う
# # 入力リスト input_list = [1, 2, 3, 4, 5] print('入力: ' + str(input_list)) def calc_double(x): """ 引数を2倍して返す関数 """ return x * 2 # # 出力用のリスト ans_list = [] ans_list = list(map(calc_double, input_list)) print('出力: ' + str(ans_list))
- mapの使い方
- map()の第1引数は適用したい関数、第2引数は対象となるリスト(タプルや集合でもOK!)
- map()だけでは戻り値がオブジェクト?になってしまうので、リスト型でキャスト。
map+lambdaを使う
# # 入力リスト input_list = [1, 2, 3, 4, 5] print('入力: ' + str(input_list)) # # 出力用のリスト ans_list = [] ans_list = list(map(lambda x: x * 2, input_list)) print('出力: ' + str(ans_list))
- lambdaの使い方
- lambda (引数): (処理), (対象となるリスト)
lambda + if文
# # 入力リスト input_list = [1, 2, 3, 4, 5] print('入力: ' + str(input_list)) # # 出力用のリスト ans_list = [] ans_list = list(map(lambda x: x * 2 if x % 2 == 0 else x * (-2), input_list)) print('出力: ' + str(ans_list))
- lambdaでのif文の使い方
- lambda (引数): (処理A) if (処理Aをする条件式) else (処理B), (対象となるリスト)
結構複雑な処理も1行でできそう。
まとめ
今回は同じ処理を単純なfor文、map、lambdaを使ってやってみた。 lambdaの威力を見せつけられた結果だった。
Pythonの基本文法まとめ
久々にPythonを本格的に使わないといけなくなったので、基礎を自分用にまとめなおそうと思います。
print文
print('hello world!')
for文、if文
evenSum = 0 oddSum = 0 for i in range(101): if i % 2 == 0: evenSum += i else: oddSum += i print(f'偶数合計:{evenSum}, 奇数合計:{oddSum}')
for文やif文の書き方は特に難しくはない。 f' は fstringと呼ばれ、文字列の中に変数を埋め込むことができる。一昔前の.formatと同様の使い方で、表示桁数なども設定可能。
while文
evenSum = 0 oddSum = 0 i = 0 while i < 101: if i % 2 == 0: evenSum += i else: oddSum += i i += 1 print(f'偶数合計:{evenSum}, 奇数合計:{oddSum}')
ひとつ前のfor文と同じ処理をwhile文で書いてみた。
リスト
- リストへの直接代入
x = [[11, 12, 13], [21, 22, 23], [31, 32, 33]] print(x) x[0][2] = 4 print(x) x[2][0] = 5 print(x)
- リストの操作
- x.pop() ⇒ リスト'x'の末尾のデータを削除
- x.pop(n) ⇒ リスト'x'の任意の位置nのデータを削除
- x.insert(n, d) ⇒ リスト'x'の任意の位置nにdを挿入
x = [11, 22, 33, 44] print(x) x.pop() print(x) x.append(55) print(x) x.insert(2, 66) print(x) x.pop(1) print(x)
辞書
d = {'one': 1, 'two': 2, 'three': 3} print(d) r = {} for t in d.items(): r[t[1]] = t[0] print(r)
辞書はキーと値をセットで記録したいときに便利! ただし、順序(インデックス)は把握できない。
EncodingクラスでShift-JISを扱うには?
C#でファイル入出力機能を作成していて、Shift-JISのテキストを読み込むのにてこずったのでメモ
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
この1文をShift-JISを扱う前に入れるだけで解決!