hsmwhsmw

初心者入門範囲オブジェクト - 繰り返し - Ruby入門

範囲オブジェクトは指定した最初の値と最後の値の範囲を表すオブジェクトです。範囲オブジェクトは繰り返し処理と一緒に使用して順に値を取得したり、ある値が範囲内に含まれているかどうかを調べるために使われます。ここでは特に繰り返し処理を一緒に使用する場合に限定して確認します。

範囲オブジェクトを作成するには「..」演算子を使用します。

first..last

「..」演算子の左辺に最初の値を指定し右辺に最後の値を指定します。最初と最後の値には数値や文字列などのオブジェクトが指定できます。

具体的には次のように使用します。

range1 = 5..10
range2 = "d".."g"

変数「range1」には「5」から「10」の範囲を持つ範囲オブジェクトが代入されます。また変数「range2」には"d"から"g"の範囲を持つ範囲オブジェクトが代入されます。

最初と最後の値には任意のオブジェクトが指定できますが、最初と最後の値は大きいか小さいか等しいかなどの比較が出来るものでなければなりません。数値と数値、文字列と文字列などが一般的には利用されることが多いです。

なおよく似た演算子として「...」演算子が用意されています。

first...last

この場合、範囲オブジェクトが持つ範囲に最後の値は含まれません。

Rangeクラス

範囲オブジェクトは実際にはRangeクラスのオブジェクトです。「..」演算子や「...」演算子によって範囲オブジェクトを作成できますが、Rangeクラスのクラスメソッドである「new」メソッドでも作成できます。

Range.new(first,last[, exclude_end])

「first」には最初の値を、「last」には最後の値を指定します。また「exclude_end」は最後の値を要素として含めるかどうかを指定します。真の値を指定した場合は最後の値を含めません。省略された場合は最後の値を含めます。

具体的には次のように使用します。

range1 = Range.new(5, 10)
range2 = Range.new(5, 10, true)

作成される範囲オブジェクトは「..」演算子と「...」演算子を使用した場合と同じです。

範囲オブジェクトを繰り返し処理で使用する場合の注意点

範囲オブジェクトを「for」文の中で使用した場合、最初の値から最後の値まで(「..」演算子の場合)順に値を取り出し要素として返します。取り出す方法は最初と最後に指定したオブジェクトの元になっているクラスで定義されている「succ」メソッドを使われます。

「succ」メソッドがどのような値を返すのかはクラスによって異なります。ここでは数値オブジェクトと文字列オブジェクトを指定した場合を確認しておきます。

数値オブジェクトが最初と最後に指定されている場合は、最初の値から最後の値まで1ずつ加算した値を要素として返します。

1.succ   ->  2
99.succ  ->  100
-5.succ  ->  -4

実際には次のように使います。

for num in 3..5 do
  print(num, "¥n")
end

上記の場合は「3」「4」「5」と順に出力されます。

文字列オブジェクトが最初と最後に指定されている場合は、アルファベットについてはを(アルファベットだけの)26進数として扱い、数値は10進数として扱って次の値を要素として返します。

"a".succ  ->  "b"
"z".succ  ->  "aa"
"Ad".succ ->  "Ae"
"Az".succ ->  "Ba"
"zz".succ ->  "aaa"
"4".succ  ->  "5"
"9".succ  ->  "10"
"a9".succ ->  "b0"
"9z".succ ->  "10a"

文字列にアルファベットや数値が含まれる時にその他の文字も含まれる場合はその他の文字はそのまま変わりません。

"4:5:9".succ  ->  "4:6:0"
"-5".succ     ->  "-6"

実際には次のように使います。

for num in "a".."d" do
  print(num, "¥n")
end

上記の場合は「a」「b」「c」「d」と順に出力されます。

なお、「succ」メソッドが定義されていないクラスのオブジェクトは最初と最後の値として指定できません。(範囲オブジェクトとしては作成出来ますが、「for」文などに使うとエラーとなります)。浮動小数点数を表すFloatクラスでは「succ」メソッドが定義されていませんので浮動小数点数で指定された範囲オブジェクトは繰り返し処理の中で指定できません。

また最初の値が最後の値よりも大きい範囲オブジェクトも作成できますが、「for」文の中で指定しても要素を1つも返しません(最初の値も返しません)。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test4-1.rb

#! ruby -Ku

print("18..20 is ¥n")
for num in 18..20 do
  print("num = ", num, "¥n")
end

print("18...20 is ¥n")
for num in 18...20 do
  print("num = ", num, "¥n")
end

print("¥"Ax¥"..¥"Bc¥" is ¥n")
for str in "Ax".."Bb" do
  print("str = " + str + "¥n")
end

上記のプログラムを「test4-1.rb」として保存します。文字コードUTF-8です。そして下記のように実行して下さい。

範囲オブジェクト

初心者入門foreach文で配列要素の値を変更する - 繰り返し処理 - PHP入門

foreach文で要素の値を変数に格納すると、値のコピーが変数に代入されます。その為要素の値を利用することはできますが、要素の値を変更することは出来ません。キーを一緒に取得し配列変数に対して要素の値を変更することも可能ですが、次の書式を利用することもできます。

foreach (配列変数 as &変数){
  実行する処理1;
  実行する処理2;
}

変数の前に「&」を付けることで要素の値に対する参照を設定することができます。よって変数に対して新しい値を代入することで、要素の値を変更することが可能になります。

例えば次のように記述します。

$pricelist = array(80, 100, 120);

foreach ($pricelist as &$value){
  $value *= 1.05;
}
unset($value);

今回は要素の値に対する参照を取得し、各要素の値を1.05倍して再度格納しています。最後に「unset」関数を呼び出しているのは、foreach文が終了しても変数「value」には配列の最後の要素に対する参照が設定されたままのため、その後のプログラムで間違って要素の値を書き換えないように変数の割り当てを明示的に解除しています。

サンプルプログラム

では簡単なプログラムで試して見ます。

sample10-1.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
$pricelist = array(80, 100, 120);

foreach ($pricelist as &$value){
  $value *= 1.05;
}
unset($value);

foreach ($pricelist as $value){
  print $value.'<br />';
}
?>
</p>

</body>
</html>

上記のファイルをWWWサーバのドキュメントルート以下に設置しブラウザからアクセスすると次のように表示されます。

foreach文で配列要素の値を変更する

PHP入門の他の記事を見てみる

初心者入門Ruby on Rails入門 ~ Railsを使ったアプリケーションの開発手順~

eyecatch

Ruby on RailsはWebアプリケーション作成のためのフレームワークの一つであり、プログラミング言語としてRubyを使用するフレームワークの代表的なものです。ここではRailsを使ったアプリケーション作成の方法について順に解説を行ないます。

Ruby on Rails入門のメニュー

初心者入門クッキーを削除する - クッキーの利用 - PHP入門

クッキーは必要なくなったら削除できます。不要なクッキーは出来る限り削除しておきましょう。

クッキーを削除するためには、有効期限を昔の時間に設定することで削除します。例えば下記のようにします。

time() - 1800

サンプルプログラム

では試してみます。下記では3回アクセスがあったらクッキーを削除してみます。

cookietest4.php

<?php
    if (isset($_COOKIE["visited"])){
        $count = $_COOKIE["visited"] + 1;
    }else{
        $count = 1;
    }

    if ($count > 3){
        setcookie("visited", $count, time() - 1800);
    }else{
        setcookie("visited", $count);
    }
?>

<html>
<head><title>PHP TEST</title></head>
<body>

<?php
    print('<p>訪問回数は'.$count.'回目です</p>');
?>

</body>
</html>

上記ファイルをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。

PHPでクッキーを削除

PHPでクッキーを削除

PHPでクッキーを削除

4回目も表示はされますが、この時点でクッキーは削除されています。

PHPでクッキーを削除

再度再読み込みをするとクッキーが削除されていますので、初期化されて表示されます。

PHPでクッキーを削除

PHP入門の他の記事を見てみる

初心者入門関係演算子 - 演算子 - Java入門

今後、処理を制御するための様々な方法が出てきます。その中でもある条件を満たしている時だけ実行する条件分岐や、条件が満たされている間は繰り返し同じ処理を行う繰り返し処理などが多く利用する機会が多いと思います。

詳しい解説は別のページで行いますので下記のサンプルだけ簡単に見てください。

int old = 10;

if (old >= 20){
  System.out.println("20歳以上です");
}else{
  System.out.println("20歳未満です");
}

変数「old」に代入された値を20と比較します。大きいか等しければ「20歳以上です」と画面に出力し、小さい場合には「20歳未満です」と画面に出力します。

このような条件式で使用されるのが関係演算子です。関係演算子は2つの値を比べます。大きいか小さいかまたは等しいかなどを評価し、結果として式全体がtrue又はfalse となります。

左辺 関係演算子 右辺
^^^^^^^^^^^^^^^^^^^^
式が評価され、結果として式がtrueかfalseとなる

関係演算子として用意されているのは次の通りです。

演算子使用例意味
<a < ba は b よりも小さい
<=a <= ba は b よりも小さいか等しい
>a > ba は b よりも大きい
>=a > ba は b よりも大きいか等しい
==a == ba と b は等しい
!=a != ba は b は等しくない
instanceofa instanceof b参照型変数a が bクラス/インターフェース/配列のインスタンスかどうか

関係演算子を含む式が正しければtrueとなり間違っていればfalseとなります。例えば 10 < 20 は正しいので 10 < 20 という式がtrueとなります。なおinstanceofは取り合えず気にしないで下さい。別のページでまた確認します。

ではそれぞれ確認してみます。

大小の比較

大きさを比較する関係演算子は「<」「<=」「>」「>=」の4つが用意されています。それぞれ「小さい」「以下」「大きい」「以上」を判定しています。

左辺 < 右辺
左辺 <= 右辺
左辺 > 右辺
左辺 >= 右辺

次の例を見てください。

int num = 10;
boolean b1, b2;

b1 = num > 5;
b2 = num <= 4;

「num > 5」は変数「num」の値が10ですので正しいです。結果として式はtrueとなりますので変数「b1」にはtrueが代入されます。

「num <= 4」は変数「num」の値が10ですので間違いです。結果として式はfalseとなりますので変数「b2」にはfalseが代入されます。

等しいかどうかの比較

等しいかどうかを判定する関係演算子は「==」「!=」の2つが用意されています。それぞれ「等しい」「等しくない」を判定しています。

左辺 == 右辺
左辺 != 右辺

次の例を見てください。

int num = 10;
boolean b1, b2;

b1 = num == 5;
b2 = num != 4;

「num == 5」は変数「num」の値が10ですので間違いです。結果として式はfalseとなりますので変数「b1」にはfalseが代入されます。

「num != 4」は変数「num」の値が10ですので正しいです。結果として式はtrueとなりますので変数「b2」にはtrueが代入されます。

注意する点として、等しいかどうかを判定する関係演算子の場合、対象となる値が「基本のデータ型」の場合には値そのものを比較しますが、クラスや配列などの場合には比較するものが異なります。詳しくは配列やクラスのページで解説します。

サンプル

では簡単なサンプルで試してみます。

JSample11_1.java

class JSample11_1{
  public static void main(String args[]){
    int num = 10;

    System.out.println("num = " + num);

    System.out.print("num > 5  --> ");
    System.out.println(num > 5);

    System.out.print("num <= 4  --> ");
    System.out.println(num <= 4);

    System.out.print("num == 5  --> ");
    System.out.println(num == 5);

    System.out.print("num != 4  --> ");
    System.out.println(num != 4);
  }
}

コンパイル後に実行すると次のように表示されます。

p11-1

初心者入門ファイルに書き込む(fwrite) - ファイル関数 - PHP関数

ファイルからデータを書き込みます。fwrite関数を使います。この関数ではバイナリモードで書き込みが行われます。

引数のハンドルで指定したファイルポインタの位置に指定した文字列を書き
こみます。バイト数が指定されている場合は、バイト数分だけ書き込みます。
(指定したバイト数よりも文字列が小さい場合には文字列を書き込んだ時点
で終了)。

引数:
  handle  対象となるファイルのハンドル
  string  書き込む文字列
  length  一度に書き込む最大バイト数
返り値:
  書き込んだバイト数。エラーが起こった場合はFALSE

書き込まれる位置はfopenで指定したモードによって異なります。「r+」「w」「w+」「x」「x+」の場合はファイルポイントが先頭に設定されますので、上書きでファイルの先頭から上書きで書き込みが行われます。「a」「a+」の場合はファイルポインタがファイルの最後に設定されますので、既存のファイルの内容の最後に追加される形で書き込みが行われます。

またバイナリモードでの書き込みですので、Windows環境で使う場合にはfopenのモードに「b」を追加して下さい。(例:「ab」「wb」)。

実際の流れは下記のようになります。

$data = 'abcdefg';

$fp = fopen('filename', 'ab');

if ($fp){
    if (flock($fp, LOCK_EX)){
        if (fwrite($fp,  $data) === FALSE){
            print('ファイル書き込みに失敗しました');
        }else{
            print($data.'をファイルに書き込みました');
        }

        flock($fp, LOCK_UN);
    }else{
        print('ファイルロックに失敗しました');
    }
}

fclose($fp);

サンプルプログラム

では実際に試して見ます。

functest43.php

<html>
<head><title>PHP TEST</title></head>
<body>

<?php
$data = 'abcdefg';

$fp = fopen('sample.txt', 'ab');

if ($fp){
    if (flock($fp, LOCK_EX)){
        if (fwrite($fp,  $data) === FALSE){
            print('ファイル書き込みに失敗しました<br>');
        }else{
            print($data.'をファイルに書き込みました<br>');
        }

        flock($fp, LOCK_UN);
    }else{
        print('ファイルロックに失敗しました<br>');
    }
}

$flag = fclose($fp);

if ($flag){
    print('無事クローズしました');
}else{
    print('クローズに失敗しました');
}

?>
</body>
</html>

書き込みの対象となる"sample.txt"は下記のようなファイルです。

fwriteのテスト

サンプルプログラムをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。

fwriteのテスト

今回は追加する形で書き込みを行いましたので"sample.txt"は下記のようになっています。

fwriteのテスト

では次に上書きした場合も試してみます。

functest44.php

<html>
<head><title>PHP TEST</title></head>
<body>

<?php
$data = 'abcdefg';

$fp = fopen('sample.txt', 'wb');

if ($fp){
    if (flock($fp, LOCK_EX)){
        if (fwrite($fp,  $data) === FALSE){
            print('ファイル書き込みに失敗しました<br>');
        }else{
            print($data.'をファイルに書き込みました<br>');
        }

        flock($fp, LOCK_UN);
    }else{
        print('ファイルロックに失敗しました<br>');
    }
}

$flag = fclose($fp);

if ($flag){
    print('無事クローズしました');
}else{
    print('クローズに失敗しました');
}

?>
</body>
</html>

書き込みの対象となる"sample.txt"は下記のようなファイルです。

fwriteのテスト

サンプルプログラムをWWWサーバに設置しブラウザ経由で見ると下記のように表示されます。

fwriteのテスト

今回は上書きする形で書き込みを行いましたので"sample.txt"は下記のようになっています。

fwriteのテスト

上書きの場合は、既存の内容が全て消えた上で頭から書き込みということになりますので注意して下さい。

初心者入門文字列、リスト、rangeなどからタプルを作成する | Python入門

eyecatch

文字列やリスト、rangeなど他のオブジェクトからタプルを作成する方法を解説します。

目次

  1. イテラブルなオブジェクトからタプルを作成する

イテラブルなオブジェクトからタプルを作成する

タプル型のコンストラクタには引数にイテラブルなオブジェクトを指定してタプルのオブジェクトを作成するものがあります。

class tuple([iterable])

イテラブルなオブジェクトとはリストやタプル、文字列、辞書などです。

別のタプルからタプルを作成する

最初に別のタプルを引数に指定してタプルオブジェクトを作成してみます。

>>> mytuple = ("A", "B", "C")
>>> newtuple = tuple(mytuple);
>>> print(newtuple)
('A', 'B', 'C')
>>>

引数に指定したタプルと同じ要素を持つタプルが作成されました。なおタプルはイミュータブルなオブジェクトですので 2 つのタプルは同じオブジェクトとなりました。(詳しくは「mutableオブジェクトとimmutableオブジェクトでの is 演算子の結果の違い」を参照されてください)

文字列からタプルを作成する

次に文字列を引数に指定してタプルオブジェクトを作成してみます。

>>> mytuple = tuple("Hello Python")
>>> print(mytuple)
('H', 'e', 'l', 'l', 'o', ' ', 'P', 'y', 't', 'h', 'o', 'n')
>>>

引数に指定した文字列の 1 文字毎に 1 つの要素とした新しいタプルが作成されました。

リストからタプルを作成する

次にリストを引数に指定してタプルオブジェクトを作成してみます。

>>> mytuple = tuple(["A", "B", "C"])
>>> print(mytuple)
('A', 'B', 'C')
>>>

引数に指定したリストの要素をコピーした新しいタプルが作成されました。

rangeからタプルを作成する

range型はコンストラクタで引数に指定した開始数から終了数までの連続した数値を持つオブジェクトです。

class range(stop)
class range(start, stop[, step])

start から stop までの連続した数値を要素として持ちます。 start を省略した場合は 0 が開始数です。

※ range 型について詳しくは「range関数の使い方(開始から終了までの連続した数値を要素として持つrange型オブジェクトを作成する)」を参照されてください。

range型のオブジェクトを引数に指定してタプルオブジェクトを作成してみます。

>>> mytuple = tuple(range(10))
>>> print(mytuple)
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>>

0 から 9 までの連続した数値を要素として持つリストを作成することができました。

-- --

文字列やリスト、rangeなど他のオブジェクトからタプルを作成する方法を解説しました。