情報処理安全確保支援士(情報セキュリティスペシャリスト) - SE娘の剣 -

情報処理安全確保支援士(情報セキュリティスペシャリスト)試験に合格するためのサイトです。
過去問を多数引用しながら、基礎知識をしっかり学んでもらうように作ってあります。
また、情報処理安全確保支援士(情報セキュリティスペシャリスト)を楽しく学べるように工夫したいと思います。

18.プログラミング

■学習について
身に付けるのは結構大変だと思います。あるところまでのレベルになるまでが大変です。まず、開発環境を作るものまあまあ手間です。以下のサイトだと、開発環境が不要で、ブラウザ上でコンパイルと実行ができるので便利です。学習するだけなら、手軽さを考えても一つの選択肢になると思います。
https://paiza.io/ja

■言葉
・JRE(Java Runtime Environment)
 Javaを使うための環境というかソフト。実行するための必要なライブラリも含んでいる
・JDK(Java Development Environment)
Javaの開発環境
これがないと、javacなどのコマンドによるコンパイルができません

・Javaのアプリケーションとアプレットとサーブレット
 簡単にいうと、Javaのアプリケーションは、OS上で実行されるプログラム。アプレットは、Web上で動くプログラム、サーブレットは、Webサーバ側で動く。アプレットの場合は、端末側にJavaの環境が必要。サーブレットの場合は、端末側にはブラウザさえあればいいので、サーブレットが今の主流。→JSP
・JavaはAndoroidでも利用されており、スマホアプリはJavaで書かれることが多い。→だから、Javaプログラマにニーズが高まっている。

■開発環境のインストール
①ダウンロード
http://mergedoc.osdn.jp/
pleiades-4.7.2-java-win-64bit-jre_20171225.zipをダウンロード。

②eclipseフォルダにあるeclipse.exeの実行

■操作方法
以下がわかりやすい
https://blog.codecamp.jp/eclipse
プログラムを書いて、
メニュー⇒実行→実行→Javaアプリケーション で画面に出力される

■Javaで作成するプログラムファイルとコンパイル
①ソースファイルの作成

プログラムのソースファイルの拡張子は .java とする
(例) Pg1.java

※クラスの名前とファイル名を同じにする必要あり。
public class Pg1 {
としたら、ファイル名はPg1.javaとする。

②コンパイル
 コンピュータが理解できる言葉に変換するために、コンパイルをする
 このときのコマンドはjavac 

 (例)
> javac Pg1.java

 すると、pg1.classという売クラスファイルが作成される。.classのファイルは中間コード(バイトコード)と呼ばれる

③プログラムの実行
 コンパイルしたファイルを実行する。このとき、クラス名だけでよく、拡張子の.classは不要

> java pg1

■とにかく、プログラムを書いて、動かしてみよう!
おまじない系の文字列が多い

public class Main {
 /**
  * hell という文字を表示する
  変数aに入れた値1を表示
  */
 public static void main(String[] args) {
  System.out.println("hello");
  int a=1;
  System.out.println("aの値は、" + a + "です。");
 }
}

■System.out.println
・変数を記載すると値が表示される。
・文字は""で囲うことで、そのまま表示。文字や変数をつなぎ合わせるのに+を使う。
 System.out.println("aの値は、" + a + "です。");
 ※aには1が格納されている

【出力結果】
 aの値は、1です。

・System.out.printを使うと、最後に改行コードが入らない。つまり、printlnのlnは改行(line)の意味である。まあ、厳密には、改行はLF(Line Feed)だと思いますが…。

■変数とデータ型
・型の宣言は必ず必要
・なぜ型が必要か。それは、変数ごとに値を格納するメモリ領域を確保するため。メモリ領域にどれだけのサイズを確保するかを決めるために型がある。
たとえば、intは4バイト、longは8バイト、charは2バイト、など。
・型が違うと代入できない。たとえば、int型の変数に3.2の小数を入れることはできない。ただ、逆というか、大きなサイズに小さなサイズの型は入る。たとえば、float型の変数に、整数3を入れることは可能。ただ、実際には3.0などのfloat型に変換されている。

・大文字小文字は区別される
・小文字で作成するのが一般的
・変数には、intやchar、double、booleanなどの基本型とString型、配列などの参照型がある。基本型は値がそのまま入っているが、参照型は、データを格納している場所の情報を格納している

(1)整数
 整数の型は、int(4バイト) とlong(8バイト)があるが、厳密にはshort(2バイト)とbyte(1バイト)がある。一般的にはintを使いましょう。

①int 4バイト整数

書き方は以下です。
int n;
n=123;

または
int n = 123;

intは整数型なので、i =5/2 とすると、2.5であるが、小数点は切り捨てられて2になる。
たとえば、以下を実行すると、2が表示される。
public class Main {
public static void main(String[] args) {
int i=5;
i=i/2;
System.out.println(i);
}
}

②long 8バイト整数
long m;
m=123456789L; //末尾にLまたはlをつける。小文字lだと1と間違えやすいので、大文字Lがいいだろう。

または、

long m=123456789L;

(2)小数
1.234などの小数(浮動小数点)を扱う場合は、float、double型を使う。一般的にはdoubleを使う。floatを使う場合は、longでLを付けたように、最後にF(またはf)をつける。

(3)文字および文字列
③char 文字(1文字) ★文字は'で囲う
char c;
c= 'A'; // 'で囲う(Stringは")

④String 文字列 ★Sは大文字、文字列は"で囲う
String mojiretsu = "Hello!";
改行コード(\r)を入れることも可能

(4)その他
⑤bolean型
boolean型(ブーリアンと読む)は、trueかfalseを表す

■変数の型変換
・ (double)a/b とすると、int型の値を割り算してdouble型にできる
・例は以下。iはintなので整数。jは小数点なので、double型。このとき、(double)をつけることで、doubleのか型に変換している。(double)をつけないと、i/2の結果の小数点が破棄されて2.0となってしまう。
public class Main {
public static void main(String[] args) throws Exception {
int i=5;
double j=(double)i/2;
System.out.println(j);
}
}

 ・int i = Integer.parseInt(a); //文字列を数字に変換する

 ■演算子
+ 和
- 差
* 積
/ 商
% 余り  たとえば、a%3 であれば、aを3で割った余り

n += 5;  // n=n+5
n -= 5;  // n=n-5
n++; // n=n+1
n--; // n=n-1

文字列でも使える。文字を結合することができる。
String a;
a="こん"+"にちは";
System.out.println(a);
※残念ながら、引き算や他の演算はできない・・・。まあ、当然か。

■コマンドライン引数
main関数に引数を渡すことができます。渡した引数は、argsの配列に格納されます。
※argsは、arguments(引数)という意味。

-----プログラム
class Test {
public static void main(String[] args) {
  System.out.print(args[0]);
  System.out.print(args[1]);
 }
}

------ 実行しましょう
> java Test orange apple
orange
apple

■キーボードからの文字や数字の入力
書き方はいろいろあるみたいだ。

(1)数字の入力 nextInt()を使う
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("好きな数字は?"); //文字列を表示
int num = scanner.nextInt();
System.out.println("あなたの好きな数字は " + num + " です!");
}
}

⇒まとめることも可能
public class Main {
public static void main(String[] args) {
System.out.println("好きな数字は?"); //文字列を表示
int num = new java.util.Scanner(System.in).nextInt();
System.out.println("あなたの好きな数字は " + num + " です!");
}
}

(2)文字列の入力   ・・・nextLine()を使う
文字列なのでString型にして、nextInt()の代わりにnextLine()を使う

■クラスとメソッド
冒頭の以下のTestというのがクラス名。
クラス名の先頭は大文字で
public class Test {

クラスの関数の中に記載するプログラムがメソッド

・言葉だけの説明ですが、・クラスの中で定義されている変数をメンバ変数(または属性)といい、メソッドは操作と言います。

ただ、広い意味のメソッドと、狭い意味ではメソッド(=手続き)があると思う。(確証はない)
狭義のメソッドの場合、クラスの中の処理の部分、つまり手続きという意味。広い意味のメソッドは、複数のメソッドも束ねた処理のひとまとまり。クラスで記載されるひとまとまりである。
なので、public class Main{ で始まるのもMainメソッドである。
MainがあることからわかるようにSubもある。サブメソッドを定義できる。このサブメソッドは、Mainから呼び出され、プログラムをまとめた部品となる。部品を活用することで、プログラムの保守性は格段に上がる。


(2)シンプルなメソッドを作ってみましょう。

public class Main {
public static void main(String[] args) { 
System.out.println("こんちくわ");
}
}

これを、methodとうメソッドで、処理を分けてみる。
部品化できるので、他でも流用可能だ。

public class Main {
public static void main(String[] args) {
method();
}

public static void method(){
System.out.println("こんちくわ");
}
}

■クラスとインスタンス
クラスを実体にしたのがインスタンス
インスタンス化(=クラスをインスタンスにする)にはnewを使う

class Fruits {
double size;
}
・・・  {

Fruits orange = new Fruits();
Fruits apple = new Fruits();}

--------事例
public class Main {
public static void main(String[] args) {
Main abc = new Main(); //Mainクラスのインスタンスをnewで作成
abc.print("A");//手続き
}
void print(String moji){
System.out.println(moji);
}
}

※シングルクォーテーション’にした場合、つまり obj.show('A') にしたら、以下に変更する。
void show(char sign)

■配列とは
変数をまとめて管理。番号(要素)をつけて管理できる。要素というか添え字は0から始まる。
配列に入るのは、同じ型のデータだけ

・配列の宣言
int[]data; 
data[]= new int[3];  //new によって、初期化するのとメモリ領域を確保している。int型が4つであれば、int(はたしか4バイトだったので)に必要なメモリを確保する。

※または、以下のように1行でも可
int[]data = new int[3];


注意点として、配列を宣言するだけのときには、要素数は指定できない。
つまり、int data[3]; とはできない。

・配列に値を入れる
 data[0] = 10;
 data[1] = 20;

①方法1
int[]data;// int data[]でも同じ
data=new int[3];
data[0]=10;
data[1]=20;
data[2]=30;

②方法2
int[]data={10,20,30}; 

③方法3
int[]data=new int[]{10,20,30};

★疑問 配列に入れるときは、クラスを作ってインスタンスに入れる方法と、いきなり変数に入れる方法があるのか(上記の②)
まあ、結果的には同じか。

・配列の長さを求めるのは、配列名に「.length]をつける
 int nagasa=data.length;

・配列でループさせる
以下のように、配列の長さの指定をdata.lengthにしておくといいでしょう。
int[] data=new int[]{10,20,30};
for (int i=0;i<data.length;i++){
System.out.println(data[i]);
}

⇒これは拡張forとう便利な構文を使って、簡略化して書くことができる。
int[] data=new int[]{10,20,30};
for (int a:data){
System.out.println(a);
}
これは、dataの配列の値を一つずつaに入れて処理してくれる。

■条件式
(1)基本
if (n>=10){ //nが10以上なら
if (n==10){ //nが10なら。=を2つつける。
if (moji.equals("終わり"){ //mojiが「終わり」だったら。文字列の場合は==ではなく、.equalsを使う
if (value != false){ //valueがfalseでなければ

(2)オプション
&& を使うと、2つの条件のAND
|| を使うと、2つの条件のOR
!  を使うと、条件の否定  →(例) if (!n==0) {

(3)三項演算子
a>b ? 1:2 a>bであれば1そうでなければ2を返します。

■ifの条件文
たとえば、年齢で大人か子供を判断する場合
int age=-10;
if (age>=20) {
System.out.print("大人");
} else if(0<=age){
System.out.print("子供");
} else {
System.out.print("正しく入力してください");
}

⇒⇒この場合は書きにくいが、if文をswitchでも書くことができる。
  switch(条件)
 case 条件の値1: //ここはコロン:
   処理;
   break;
  switch(条件)
 case 条件の値2: //ここはコロン:
   処理;
   break;

・同じ場合は==を使う
 ==  等しい
 <
 >
 >=
 <=
 != 等しくない
・ただし、文字列(String)の場合は、equalsを使う
★でも、以下はうまくいっていない。
String you="Gu";
if (you.eqals("Pa")) {
System.out.print("負け");
} else if(you.eqals("Choki")){
System.out.print("勝ち");
}
else if(you.eqals("Gu")){
System.out.print("アイコ");
}
}

■forによる繰り返し
int i=0;
for (i<5;i++){
system.out.println("iの値は" + i);
}

・減らしていく場合は i--

■while、forを使った繰り返し
簡単な例で、i=1 から5として、順に表示してみましょう。
(1)前判定
int i=1;
while(i<=4){
System.out.print(i); //改行コードを入れていません。
i++;
}
これは前判定で、後判定にすることも可能です。
その場合は、do whileを使います。
(2)後判定
int i=1;
  do{
System.out.print(i); //改行コードを入れていません。
i++;
} while(i<=4);

(3)forを使う場合
for (int i=1;i<=4;i++){
System.out.print(i); //改行コードを入れていません。
}
※こっちの方が、スッキリ書けますね。

■Forによるループの詳細
続きです。
forによる繰り返しを中断、またはスキップする方法があります。
①break 
 breakはswitchでも使いました。
 これを入れると、ループを中断して抜けます。
②continue
 continueは、1回だけ処理を抜ける場合に使います。ループ処理は継続されます。

■エスケープシーケンス
\n 改行
\' 'の意味。\をつけないと、プログラム上の意味で利用される

■コメントの書き方
1行のコメント → // コメント
複数行のコメント /*
           この間に複数行のコメントを書く
         */

 ■その他
System.exit(0); //プログラムの正常終了

 ■やってみよう!
①「こんにちは!」と表示するプログラムの作成

②変数に文字をいれてみよう

単純なプログラムとして、変数mojiに「こんにちは」と入れ、それを表示してみましょう。
public class Main {
public static void main(String[] args) {
String moji ;
moji = "こんにちは"; // String moji = "こんにちは"; と、1行にまとめても可
System.out.println(moji);
}
}

③文字列を入力してもらい、それを変数に入れてその文字を表示しましょう。

◆Python(パイソン)
・Pythonは、ニシキヘビの意味らしく、ロゴも蛇が2匹である。
・バージョン 2.x代と3.0代では大きく違う
現在では、Python3.6か3.7を使うだろう
・攻撃コード(PoCコード)などはPythonで書かれることが多い。セキュリティ系のエンジニアはPythonを使うことがよくある。
・Googleのサービスでは主にPythonで書かれている。AIでも活用されている。
・Pythonは手続き型のCとは異なり、オブジェクト指向型の言語です。これは、Javaと同じなのですが、Javaは基本はコンパイルしますが、
VBScriptやJavascriptなどのように、スクリプト言語です。※スクリプト言語の方がわかりやすくて便利ですよねー。
・Cなどに比べてシンプルな構文になっているので、初心者でもわかりやすい言語かもしれない。
・感覚でしかないが、Javaの半分以下で書けると思う。→習得も早い
・Pythonは基本はLinuxで使いましょう。Windowsでも使えるが、モジュールなどが
不十分だったりする。
・解説は以下がありがたい。
http://www.tohoho-web.com/python/index.html

◆Pythonのインストール
Pythonのサイトからインストールする
https://www.python.org/
Windows版もあるので、それを選択する。
Python>>> Downloads>>> Windows
から、64ビットか32ビットなどを考慮してダウンロード

実行時には、Add Python 3.6 to PATHのチェックを入れる

◆Pythonの実行
①起動
WindowsのPowershellから起動できる。
まず、インストールの確認として、バージョンを確認しよう
PS C:\> python --version
Python 3.7.2
3.7.2がインストールされていることがわかる。

②基本コマンド
Linuxと同じである。
lsやらpwd、cdなどが使える

③Pythonの対話型モード
pythonと入力すると、対話モードになり、コマンドを実行できる。
PS C:\python> python
Python 3.7.2・・・・・・
>>> 3+5   ←3+5を実行する
8      ←結果が表示される。

抜けるにはexit()か、quit()、Ctrl+Zでリターンを押す

④通常は、ファイルを作成する
拡張子は.pyとする。基本はすべて小文字。たしか、先頭に数字はダメだった気がする。

ためしに書いてみる。とっても簡単だ。しかも、構文がわかりやすい。Cだとprintfという
無駄なfがついているのでわかりにくい。
----------- pg1.py
print("こんちくは")

※UTF-8の文字コードを使う。
UTF-8の場合は以下が書かれてある。Shift-JISなどの場合は変える必要あり
# -*- coding: utf-8 -*-

エディタはATOMであったり、Windows環境であれば
PowershellでデフォルトにあるIDLEが便利かも
https://www.lifewithpython.com/p/pythonide.html
文字サイズは「options」から変更できる

★コメント
1行コメントは#
複数行の場合は'''または """
★Javaなどであった;は不要。;を使って、2つの行を一つにすることもできる。
たとえば
a=10
b=5
→a=10;b=5

⑤実行
コマンドプロンプトからでも
c:\python>test.py

Powershellからでも実行できる。こちらの場合は、pythonと入れる
PS C:\python> python test.py

◆print 文字を表示する
#文字列を表示する。文字列は"で囲う
print("こんちくは") 

#改行を含めて表示するには"""で囲う
print("""ab
cde
fg""")

◆変数
(1)全般
javaでもCでも型の宣言が必要だったが、不要
moji="こんちくは"

※ダブルクォーテーション”でもシングルクォーテーション’でもどちらでもいい

では、文字を変数で表示してみましょう。
moji="こんちくは"
print(moji)

(2)有効範囲
・変数は関数の中と外では、同じ変数aでも別物と扱われる
・関数の内で宣言された変数はローカル変数、外で宣言されたのはグローバル変数
・globalとつけることで、関数内に閉じない変数を宣言できる
 
(3)定数
値を変えない定数を定義する場合は、大文字で書くことが慣習。
たとえば、消費税をTAX=1.08 とする

◆データ型
cやJavaではデータ型を宣言していたが、pythonでは不要。
→便利ですよねー。
文字を入れたら文字型に、数字を入れたら数値型にしてほしいって思ってた。

参考までにtypeは、文字の型を表示する。
以下は文字を入れた場合と数字を入れた場合

>>> a="こんちくは"
>>> type(a)
<class 'str'>
>>> a=2
>>> type(a)
<class 'int'>
>>> a=12.345
>>> type(a)
<class 'float'>

※Javaなどでは文字型(Char)と文字列(String)があったが、Stringで
統一されている気がする

・型変換 →キャストする、とも言います。
変数の型を指示することで、型を変換できる。
int()
str()
(例) 整数を文字と足すとエラーになるが、以下のようにstr(a)
として文字型にしている。

>>> a=3
>>> "こんに"+a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>> "こんに"+str(a)
'こんに3'
>>>

・辞書型がある。以外に便利なので、後述

◆演算
Pythonに限らず、CやJavaでも基本的に同じである。

+ 足し算
- 引き算
* 掛け算
/ 割り算
// 割り算で、少数以下を切り捨てる
 → 10//3  →3になる
% あまり (例)5%2 →あまり1
** 2乗

n+=5 → n=n+5
n-=5 → n=n-5

== 等しい
 →1==1と実行すると、一致するのでTrueが返る
!= 等しくない
>
<
>=
<=

・優先度は掛け算や割り算が優先
3+5*2であれば、掛け算が先
(3+5)*2 とかっこをつけると、かっこの中が優先

・文字列の足し算、掛け算もできる。引き算はできない。
> "こんち"+"くは"
こんちくは
> "こんち"*3
こんちこんちこんち

・論理演算 AND、OR、NOTなど
たとえば、以下
>>> True and False  ←AND条件
False
>>> True or False   ←OR条件
True
>>> not True  ←NOT(否定)
False

◆文字入力
javaに比べたら、驚くほど簡単である。なぜ、javaはあんなに面倒なんだろうか・・・

(例文)

print("文字を入力してください")
a=input() #1行で、a=input("文字を入力してください")としてもOK
print("あなたが入力した文字は" + a + "ですよねー。")


入力された文字をint型にするには
a=int(input())

◆関数
関数はあらかじめ作成されているものもあれば、自分で作ることもできる。
関数を使うことで、毎回処理を書く必要がないので、楽である。

あらかじめ作成されている関数は以下に記載がある。
https://docs.python.jp/3/library/functions.html

先に紹介したtypeもその一例
>>> a=2
>>> type(a)
<class 'int'>

→自分で関数を作ることに関しては、後述

◆print
C言語みたいに、変数の型に応じた表示が必要。
string(文字列)型は%s、int型は%d
(例)
moji="モジ"
atai=123
print("moji= %s,atai=%d" %(moji,atai))

・改行を無しにする
printで、end=''とする。

-----(例)
for i in range(5):
 print(i,end='')
 

◆if文
if 条件式:
 処理  #{}がないので、位置が重要。tabでインデントの調整をする
elif 条件式:  #else if じゃないよ
 処理
else:
  処理
 
(例)
a=70

if a>=80:  # この条件が正しければ、以降の処理は行われない
    print("Good")
elif a>60:
    print("WoW")
else:
    print("Sorry")

※もちろん条件を組み合わせることも可能。
 a>60 and a<=70

★重要
javaなどの場合、開始と終わりが{}で囲われていた。
なので、どこまでがif文の内容なのかがわかりやすかった。
しかし、pythonでは{}がないので、改行位置で終わりを判断する。

たとえば以下は、文字列mojiの中に、sがいくつ入っているかのプログラム

moji='I am a boy.I like sushi very much'

i=1
for a in moji:
    if a=='s':
      print(str(i) + '番目にsがあった!')
    i += 1   ←この位置が重要。上のprintと同じインデントの場合、
    a=='s'の条件の続き、つまり一致したらiのカウントを足す。インデントを
    前にずらすと、if文とは条件とは関係なくiが加算される。

◆for によるループ

for i in range(5):
 処理

例)
for i in range(5):
 print(i)
else:
    print(str(i)+'でした')

・javaなどと同様に、break、continueも使える
 
◆while によるループ
i=0
while i<5
  print(i)
  i +=1

※こちらも、elseやbreak、continuなども使える

◆エスケープシーケンス
// /は無効化しているので、/を意味する
/' 上と同じで’を意味する。
/n 改行
/t タブ
"""で記載すると、コメントになるが、そのあとに書いた文字の改行がそのまま使われる。

◆リスト (=CやJavaなどの配列)
便利ですね。CやJavaで初めて学習したときは、ピンときませんでしたが・・・
以下、とても詳しいです。
https://www.sejuku.net/blog/23633

添え字というか、番号は0から始まる

・宣言方法
a=[]
or
a=[75,70,80,90,70]  #5教科の点数をイメージ

以下を実行してみましょう。どうなるでしょうか。
a=[75,70,80,90,70]  #5教科の点数をイメージ
print(a)  #  [75,70,80,90,70] と表示
print(a[0]) #75を表示
print(a[3]) #90を表示
print(sum(a)) #合計385を表示
print(sum(a)/len(a)) #平均点77を表示


・リストの操作
リスト(配列)のソート(小さい順に並べる)したり、逆にしたりできる
ab=[75,70,80,90,70]
print(ab)
ab.sort()   // ソートする
print(ab)   // [70, 70, 75, 80, 90]
ab.reverse()  // 逆にする
print(ab)   //[90, 80, 75, 70, 70]
ab.insert(0, 100) //先頭に100を追加する。0は位置で、先頭。-をつけると、後ろから何番目という書き方もできる。-2であれば後ろから3番目

・appendで末尾(end)に追加(app)
・extendでリストを結合できる


◆range関数
range(5)を使って、[0,1,2,3,4,5]という配列を作る
http://programming-study.com/technology/python-range/

for i in range(5):
 print(i)

これにより、0から4が表示される。
単に、0から4のループとしても使える。

さて、いくつか実行してみましょう。

>>> print(range(5))
range(0, 5)
>>> print(list(range(5)))
[0, 1, 2, 3, 4]


◆関数の作成
・def 関数名:
 処理

単純な例を作ります。helloという関数を作り、hello()で呼ぶ。ただこれだけ。

-----pg1.py 

def hello():
   print("こんちくは")

hello()

 
・引数を渡すことができる。引数がない関数はkan()な感じ。
・戻り値をreturnで返せる。※returnの後の処理は実行されない。

・小文字のアルファベットで作ろう。先頭に数字はダメだったはず。

・スクリプト言語なので、上から順に実行される。関数の順番にも注意が必要

(例)値を入力し、その値の2倍を返すプログラムを作る

def bai(x): #これが関数
    y=x*2
    return y #2倍にして返り値をyとして返す

print("数字を入力してください") #画面に表示
x=int(input()) #入力された文字をxに入れる。intにしておかないと、文字列として扱われてしまう
z=bai(x) #bai(x)だけにすると、関数baiで実行した返り値を受け取ることができない。なので、受け取る箱としてzを用意
print(z) #返り値として受け取った値を表示する。

 
◆モジュール
関数よりも大きな次元で、ファイルとして部品化すること。
たとえば、印刷機能などは、どのプログラムでも使うので、モジュールとしてどのプログラムからでも呼び込めるようにしたほうがいい。

モジュールを使うにはimportする。
標準モジュールの場合は、すでに組み込まれているので、宣言するだけ。
たとえば、randomのモジュールをimportすれば、ランダム数の簡単に作成できる。

作成したモジュールの場合は、たとえばそのモジュールをmod1.py とした場合は、以下を記述する。
import mod1

そして、モジュールの中の関数を使うには、モジュールを指定して関数をつける。たとえば、mod1.func

・追加のモジュールというかライブラリはpipコマンドでインストールできる。
Linuxのyumのイメージ


◆コマンドライン引数
CやJavaと同じである。コマンドを入力する際に、引数をいくつか渡す。

----pg1.py
import sys
print(sys.argv[1])
print(sys.argv[2])

※sys.argvという配列(リスト)に、入力された文字が格納されている
では、上記に引数を渡して実行してみよう。

>pg1.py 10 25
10
25

◆文字列の処理
いろいろなメソッドが用意されている。

replace() →文字列の置換
find()→文字列の検索
lower()→文字を小文字にする
split()→文字を区切る

◆クラス
クラス名の先頭は大文字。c.f.変数は小文字
インスタンスを作るには、インスタンス名=クラス名()とする。

(例)成績のクラスを作り、英語と数学の合計を出す
--------pg1.py

class Score:  #Scoreというクラスを作成
    def sum(self,english,math): #sumというメソッドを作成。最初の引数は必ずself
        return english+math
user1=Score() #Scoreクラスのuser1のインスタンスを作成
print(user1.sum(75,85))
user2=Score() #Scoreクラスのuser2のインスタンスを作成
print(user2.sum(70,65))


◆コンストラクタ
インスタンスを作成したときに実行されるもの
Classの中にインストラクタのメソッドを書く。
具体的には、__init__で作成する。

(例)
class Score:  #Scoreというクラスを作成
    def __init__(self,english,math): #最初の引数は必ずself
        self.english=english  #このように、self.となるので、selfはインスタンスみたいなものとも考えられる。
        self.math=math
    def sum(self):  #合計を求める
        print(self.english+self.math)
    def avg(self):  #平均を求める。
        print((self.english+self.math)/2)

user1 = Score(75,85) #user1のスコアを代入←クラスにデータを持てる
user1.sum() #user1の合計を表示 ←クラスの手続きを実行できる
user1.avg()
user2=Score(70,80)
user2.sum()
user2.avg()


◆インスタンス変数
インスタンスで持つ変数。→クラス変数もある
「self.変数」の形で書く。
Classは概念で、インスタンスは実体という説明をしたと思いますが、車というクラスの中に、マーチやカローラやセルシオなどの複数の実体があります。
クラスで変数を定義してしまうと、すべてのインスタンスで共通の変数になります。
一方、インスタンス変数であれば、インスタンスごとに独立した変数を持てます。

◆クラスの継承
親クラスのメソッドなどを子クラスに継承する。
たとえば
class Parent: #親クラスの定義
 ・・・
class Child(Parent): #親クラスParentを継承
 ・・・

親クラスのメソッドを使う場合にはsuper()を使う
 
 
◆メモリ空間
Pythonでまメモリの領域を表示するにはidを使う。

>>> a=123
>>> id(a)
140709562806928

◆例外処理
try:
except:
これにより、例外発生(0で割る)などが発生したときの対処ができます。
たとえば、以下

---------pg1.py
a=int(input('数字を入力してください'))
try:
    print(10/a) #aで割るので、aが0だと例外処理にしたい
except:
    print('ダメよーダメダメ')

-----実行結果

c:\python>test.py
数字を入力してください5
2.0

c:\python>test.py
数字を入力してください0
ダメよーダメダメ


最後に、finallyをつけると、例外処理に関係なく処理を実行できる

◆ファイル操作
pythonでは、ログファイルを見て検索したり、ファイルから何かの処理をすることがある。
こういう使い方が多いかなー。
ファイル操作はぜひ知っておきましょう。

file1=open('file1.txt')  #ファイルを開く
#通常は読み込みなので、これでいいでしょう。または、モードをつけることもできる。r(read)、w(write)、a(add)など
#file1=open('file1.txt','r') 
file1.close() #ファイルを閉じる

・ファイルを読み込む。
メソッドを覚えましょう
file1.read()  #すべてのファイルを読み込む
file1.readline()  #1行を読み込む
file1.readline()  #すべての行を配列で読み込む

・withを使うと、close()が不要になるので便利
with open('file.txt') as file1:

・1行ずつ読み込むのは以下がいいだろう

file1 = open('file1.txt', 'r')
for data in file1:
    print(data,end='') #print(data)でもいいが、end=''で改行コードを無しにしている。
file1.close()

・読んで書き出すなどもよくあるだろう。
一例ですが、以下
http://python4study.9isnine.com/file

◆Linux上でPythonを動かし、OSのLinuxOSのコマンドを実行する
subprocessをimportする。
いろいろなメソッドが用意されているが、たとえば、callは実行できたかを0か1で
返す。
実際には、生のコマンド結果を見たいだろうから、check_outputのメソッドを使う。
このとき、半角スペースごとにコマンドは配列に入れて、['ls','-la']のようにする。
。またはSplitで分ける。
また、decode()を入れておくと、結果が改行されて普通に見ることができる。

import subprocess
print(subprocess.check_output(['ls','-la']).decode())


◆辞書型
辞書は英語のスペルと意味を持ちます。たとえば、red:赤 のように。
このように、辞書形式というか表形式の値を持てます。
辞書型は{}で囲います。

>>> a={'English': 70, 'Math': 40, 'Science': 80}  #辞書型に値を入れる
>>> type(a)  # 型を確認すると、dict(辞書型)とでる
<class 'dict'> 
>>> print (a['Math'])  #aの中のMathの値を表示
40
>>> print(a.values())  # こちらでも同じくいろいろなメソッドがあり。これは値を表示
dict_values([70, 40, 80])



スポンサードリンク

↑このページのトップヘ