<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Python | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Tue, 24 Feb 2026 00:20:20 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.28</generator>
	<item>
		<title>新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 2</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_2/</link>
		<pubDate>Wed, 06 Jul 2022 04:25:29 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[新試験情報]]></category>
		<category><![CDATA[科目 B]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=guide&#038;p=6612</guid>
		<description><![CDATA[<p>2023 年 4 月から基本情報技術者試験の制度が変更され、特に科目 B 試験（従来の午後試験に該当するもの）の内容が大きく変わります。 IPA（独立行政法人情報処理推進機構）は、「基本情報技術者試験 科目 B のサンプ [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_2/">新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 2</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2023 年 4 月から基本情報技術者試験の制度が変更され、特に科目 B 試験（従来の午後試験に該当するもの）の内容が大きく変わります。 IPA（独立行政法人情報処理推進機構）は、<a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B のサンプル問題」</a>として、アルゴリズムとプログラミングの問題を 5 問と、情報セキュリティの問題を 1 問だけ公開しています。</p>
<p><a href="../new_algorithm_and_programming_1/">前回の記事</a>では、アルゴリズムとプログラミングの問題を 3 問取り上げました。 この記事では、残りの 2 問を取り上げて、解法のポイントを説明します。</p>
<style>table{font-size:.9em;}pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;background:#1a2638;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}dl.inline dd{margin-left:2em;}</style>
<h2>サンプル問題（問 4 ） データを特性に応じた構造に変換する</h2>
<p>アルゴリズムとプログラミングの問題は、</p>
<ol class="background c-round">
<li>「プログラムの基本要素（型、変数、配列、代入、算術演算、比較演算、論理演算、選択処理、繰返し処理、手続・関数の呼出し、など）」</li>
<li>「データ構造及びアルゴリズム（再帰、スタック、キュー、木構造、グラフ、連結リスト、整列、文字列処理、など）」</li>
<li>「プログラミングの諸分野への適用（数理・データサイエンス・ AI などの分野を題材としたプログラム、など）」</li>
</ol>
<p>という 3 つのカテゴリに分けられています。</p>
<p>サンプル問題の問 4 は「プログラミングの諸分野への適用」の問題です。 出題趣旨は、</p>
<blockquote>
<p class="grey-text">「多変量解析や機械学習などを用いたデータサイエンスの取組に当たっては、データを、特性に応じた構造に変換することがある。本問では、疎行列の格納に適したデータ構造への変換を題材として、プログラムの動作の理解を問う」</p>
</blockquote>
<p>です。 以下に、問題を示します。</p>
<div class="background c-round mag_h30 blue-grey-text small-text">問題はすべて<a href="https://www.ipa.go.jp/news/2022/shiken/gmcbt80000007cfs-att/fe_kamoku_b_sample.pdf" rel="noopener" target="_blank">「基本情報技術者試験 科目 B のサンプル問題」</a> より出典</div>
<div class="divider mag_h50"></div>
<div class="chip">プログラミングの諸分野への適用</div>
<p class="bold">問 4</p>
<p>次の記述中の<span class="blank">a</span>～<span class="blank">c</span>に入れる正しい答えの組合せを，解答群の中から選べ。ここで，配列の要素番号は 1 から始まる。</p>
<p>　要素の多くが 0 の行列を疎行列という。次のプログラムは，二次元配列に格納された行列のデータ量を削減するために，疎行列の格納に適したデータ構造に変換する。</p>
<p>　関数 transformSparseMatrix は，引数 matrix で二次元配列として与えられた行列を，整数型配列の配列に変換して返す。 関数 transformSparseMatrix を<br />
transformSparseMatrix({{3, 0, 0, 0, 0}, {0, 2, 2, 0, 0}, {0, 0, 0, 1, 3}, {0, 0, 0, 2, 0}, {0, 0, 0, 0, 1}}) として呼び出したときの戻り値は，{{ <span class="blank">a</span> }, { <span class="blank">b</span> }, { <span class="blank">c</span> }} である。</p>
<p>〔プログラム〕</p>
<pre>○整数型配列の配列: transformSparseMatrix(整数型の二次元配列: matrix)
 整数型: i, j
 整数型配列の配列: sparseMatrix
 sparseMatrix ← {{}, {}, {}} /* 要素数0の配列を三つ要素にもつ配列 */
 for (i を 1 から matrixの行数 まで 1 ずつ増やす)
   for (j を 1 から matrixの列数 まで 1 ずつ増やす)
     if (matrix[i, j] が 0 でない)
       sparseMatrix[1]の末尾 に iの値 を追加する
       sparseMatrix[2]の末尾 に jの値 を追加する
       sparseMatrix[3]の末尾 に matrix[i, j]の値 を追加する
     endif
   endfor
 endfor
 return sparseMatrix</pre>
<p>解答群</p>
<table class="bordered responsive-width">
<thead>
<tr>
<th></th>
<th>a</th>
<th>b</th>
<th>c</th>
</tr>
</thead>
<tbody>
<tr>
<th>ア</th>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>3, 2, 2, 1, 2, 3, 1</td>
</tr>
<tr>
<th>イ</th>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>3, 2, 2, 1, 3, 2, 1</td>
</tr>
<tr>
<th>ウ</th>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>3, 2, 2, 1, 2, 3, 1</td>
</tr>
<tr>
<th>エ</th>
<td>1, 2, 3, 4, 5, 4, 5</td>
<td>1, 2, 2, 3, 3, 4, 5</td>
<td>3, 2, 2, 1, 3, 2, 1</td>
</tr>
</tbody>
</table>
<div class="divider mag_h30"></div>
<p>出題趣旨に沿って、問題の内容を見てみましょう。</p>
<blockquote>
<p class="grey-text">「変量解析や機械学習などを用いたデータサイエンスの取組み」</p>
</blockquote>
<p>という大きな趣旨ではあっても、そのほんの一部である</p>
<blockquote>
<p class="grey-text bold text-darken-5">「データを、特性に応じた構造に変換すること」</p>
</blockquote>
<p>がテーマの問題です。</p>
<blockquote>
<p class="grey-text">「二次元配列に格納された行列のデータ量を削減するために、疎行列の格納に適したデータ構造に変換する」</p>
</blockquote>
<p>ためのプログラムが示されているので、その内容から変換方法を読み取ってください。</p>
<dl class="background c-round">
<dt>「行列」</dt>
<dd>要素を縦と横に並べたものであり、プログラムでは 2 次元配列で表せます。</dd>
<dt>「疎行列」</dt>
<dd>ほとんどの要素が 0 である行列のことです。 0 でない要素だけを保存すれば、疎行列のデータ量を削減できます。</dd>
</dl>
<p>多くのプログラミング言語では、 2 次元配列を<span class="u">「 1 次元配列を要素とした 1 次元配列」</span>として表現します。 この問題に示されたプログラムも同様です。 変換する前の疎行列は、以下の内容になっています。 ここでは、わかりやすいように、要素（ 2 次元配列の要素の 1 次元配列）ごとに改行して示しています。</p>
<figure><figcaption>図　変換前の疎行列 matrix の内容</figcaption><pre>matrix = {
  {3, 0, 0, 0, 0}, <span class="cyan-text"><i class="material-icons">label</i> 1 行目</span>
  {0, 2, 2, 0, 0}, <span class="cyan-text"><i class="material-icons">label</i> 2 行目</span>
  {0, 0, 0, 1, 3}, <span class="cyan-text"><i class="material-icons">label</i> 3 行目</span>
  {0, 0, 0, 2, 0}, <span class="cyan-text"><i class="material-icons">label</i> 4 行目</span>
  {0, 0, 0, 0, 1}, <span class="cyan-text"><i class="material-icons">label</i> 5 行目</span>
}</pre>
</figure>
<p>こうすると、行と列がわかりやすくなります。 問題文の中に</p>
<blockquote>
<p class="grey-text">「配列の要素番号は 1 から始まる」</p>
</blockquote>
<p>とあるので、先頭は 0 行目ではなく 1 行目です。</p>
<p>&nbsp;</p>
<p>ここでは、変換前の 2 次元配列が matrix であり、変換後の 2 次元配列が sparseMatrix です。</p>
<p>for 文による多重ループで matrix[i行][j列] を取り出し、もしも値が 0 でないなら、 sparseMatrix[1] の末尾に i の値を追加し、 sparseMatrix[2] の末尾に j の値を追加し、 sparseMatrix[3] の末尾に matrix[i行][j列] の値を追加します。</p>
<p>つまり、疎行列の 0 でない要素を取り出し、その行の値を sparseMatrix[1] に、列の値を sparseMatrix[2] に、要素の値を sparseMatrix[3] に格納するのです。 これは、プログラムの以下の部分です。</p>
<figure><figcaption>疎行列 matrix の 0 でない要素の情報を sparseMatrix に格納する</figcaption><pre>for (i を 1 から matrixの行数 まで 1 ずつ増やす)
  for (j を 1 から matrixの列数 まで 1 ずつ増やす)
    if (matrix[i, j] が 0 でない)
      sparseMatrix[1]の末尾 に iの値 を追加する <span class="cyan-text"><i class="material-icons">label</i> 要素の行の値</span>
      sparseMatrix[2]の末尾 に jの値 を追加する <span class="cyan-text"><i class="material-icons">label</i> 要素の列の値</span>
      sparseMatrix[3]の末尾 に matrix[i, j]の値 を追加する <span class="cyan-text"><i class="material-icons">label</i> 要素の値</span>
    endif
  endfor
endfor</pre>
</figure>
<p>ここまでプログラムを読み取れれば、変換後の sparseMatrix の内容がわかるでしょう。</p>
<p>以下に示したように、変換前の疎行列 matrix の (1) ～ (7) の要素の行、列、値が、それぞれ sparseMatrix[1] 、 sparseMatrix[2] 、 sparseMatrix[3] に追加されていきます。</p>
<figure><figcaption>図　変換前の疎行列 matrix の 0 でない値</figcaption><pre>matrix = {
  {<span class="cyan-text bold">3<sup>(1)</sup></span>, 0, 0, 0, 0}, <span class="cyan-text">(1) 1 行、 1 列、値 3</span>
  {0, <span class="cyan-text bold">2<sup>(2)</sup></span>, <span class="cyan-text bold">2<sup>(3)</sup></span>, 0, 0}, <span class="cyan-text">(2) 2 行、 2 列、値 2 / (3) 2 行、 3 列、値 2</span>
  {0, 0, 0, <span class="cyan-text bold">1<sup>(4)</sup></span>, <span class="cyan-text bold">3<sup>(5)</sup></span>}, <span class="cyan-text">(4) 3 行、 4 列、値 1 / (5) 3 行、 5 列、値 3</span>
  {0, 0, 0, <span class="cyan-text bold">2<sup>(6)</sup></span>, 0}, <span class="cyan-text">(6) 4 行、 4 列、値 2</span>
  {0, 0, 0, 0, <span class="cyan-text bold">1<sup>(7)</sup></span>}, <span class="cyan-text">(7) 5 行、 5 列、値 1</span>
}</pre>
</figure>
<p>したがって、</p>
<p>sparseMatrix[1] の内容は {1, 2, 2, 3, 3, 4, 5}、<br />
sparseMatrix[2] の内容は {1, 2, 3, 4, 5, 4, 5}、<br />
sparseMatrix[3] の内容は {3, 2, 2, 1, 3, 2, 1}</p>
<p>になります。選択肢イが正解です。</p>
<h2>サンプル問題（問 5 ）ライブラリを適切に利用する</h2>
<p>サンプル問題の問 5 も「プログラミングの諸分野への適用」の問題です。出題趣旨は、</p>
<blockquote>
<p class="grey-text">「文書を構成する言葉や文字に関する統計情報は、自然言語処理などに活用されている。本問では、ある文字に後続する文字の出現割合の計算を題材として、問題文に示されたプログラムの仕様を理解した上で、ライブラリを適切に利用し、正しく処理を実装する能力を問う」</p>
</blockquote>
<p>です。以下に、問題を示します。</p>
<div class="divider mag_h50"></div>
<div class="chip">プログラミングの諸分野への適用</div>
<p class="bold">問 5</p>
<p>次のプログラム中の<span class="blank">a</span>と<span class="blank">b</span>に入れる正しい答えを，解答群の中から選べ。</p>
<p>　任意の異なる 2 文字を c1， c2 とするとき，英単語群に含まれる英単語において， c1 の次に c2 が出現する割合を求めるプログラムである。英単語は，英小文字だけから成る。英単語の末尾の文字が c1 である場合，その箇所は割合の計算に含めない。例えば，図に示す 4 語の英単語  &#8220;importance&#8221; ， &#8220;inflation&#8221; ， &#8220;information&#8221; ， &#8220;innovation&#8221; から成る英単語群において， c1 を &#8220;n&#8221; ， c2 を &#8220;f&#8221; とする。英単語の末尾の文字以外に &#8220;n&#8221; は五つあり，そのうち次の文字が &#8220;f&#8221; であるものは二つである。したがって，求める割合は， 2 ÷ 5 = 0.4 である。 c1 と c2 の並びが一度も出現しない場合， c1 の出現回数によらず割合を 0 と定義する。</p>
<figure>
  <img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2022/07/sample_q5_figure.jpg" loading="lazy"><figcaption>図 4 語から成る英単語群の例</figcaption></figure>
<p>　プログラムにおいて，英単語群は Words 型の大域変数 words に格納されている。クラス Words のメソッドの説明を，表に示す。本問において，文字列に対する演算子 &#8220;+&#8221; は，文字列の連結を表す。また，整数に対する演算子 &#8220;÷&#8221; は，実数として計算する。</p>
<table class="responsive-width">
<caption>表 クラス Words のメソッドの説明</caption>
<thead>
<tr>
<th>メソッド</th>
<th>戻り値</th>
<th>説明</th>
</tr>
</thead>
<p>  <tbory></p>
<tr>
<td>freq(文字列型: str)</td>
<td>整数型</td>
<td>英単語群中の文字列 str の出現回数を返す。</td>
</tr>
<tr>
<td>freqE(文字列型: str)</td>
<td>整数型</td>
<td>英単語群の中で，文字列 str で終わる英単語の数を返す。</td>
</tr>
</tbody>
</table>
<p>〔プログラム〕</p>
<pre>大域: Words: words /* 英単語群が格納されている */
/* c1の次にc2が出現する割合を返す */
○実数型: prob(文字型: c1, 文字型: c2)
 文字列型: s1 ← c1の1文字だけから成る文字列
 文字列型: s2 ← c2の1文字だけから成る文字列
 if (words.freq(s1 ＋ s2) が 0 より大きい)
  return <span class="blank"></span>
 else
  return 0
 endif</pre>
<p>解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>(words.freq(s1) &#8211; words.freqE(s1)) ÷ words.freq(s1 + s2)</dd>
<dt>イ</dt>
<dd>(words.freq(s2) &#8211; words.freqE(s2)) ÷ words.freq(s1 + s2)</dd>
<dt>ウ</dt>
<dd>words.freq(s1 + s2) ÷ (words.freq(s1) &#8211; words.freqE(s1))</dd>
<dt>エ</dt>
<dd>words.freq(s1 + s2) ÷ (words.freq(s2) &#8211; words.freqE(s2))</dd>
</dl>
<div class="divider mag_h30"></div>
<p>この問題も</p>
<blockquote>
<p class="grey-text">「文書を構成する言葉や文字に関する統計情報は、自然言語処理などに活用されている」</p>
</blockquote>
<p>という壮大な趣旨ではあっても、そのほんの一部である</p>
<blockquote>
<p class="grey-text bold text-darken-5">「ある文字に後続する文字の出現割合の計算」</p>
</blockquote>
<p>がテーマです。</p>
<p>さらに</p>
<blockquote>
<p class="grey-text bold text-darken-5">「ライブラリを適切に利用し、正しく処理を実装する能力を問う」</p>
</blockquote>
<p>という趣旨にも注目してください。</p>
<p>数理、データサイエンス、 AI などのプログラミングでは、あらかじめ用意されているライブラリを活用する場面が多いので、このような趣旨なのでしょう。 どのような機能のライブラリを使うのかは、問題ごとに示されるはずです。</p>
<p>ここでは、ライブラリとして提供されている Word クラスを使います。</p>
<p>問題文を見ると、 Word クラス型の大域変数 word の中に英単語群（複数の英単語）が格納されていて、 Word クラスが freq(文字列型：str) メソッドおよび freqE(文字列型：str) メソッドを持っています。 <span class="u">これらのメソッドの機能を理解することが、問題を解く大きなポイント</span>になります。</p>
<p>&nbsp;</p>
<p>問題に示された図から、</p>
<blockquote>
<p class="grey-text">「 c1 の次に c2 が出現する割合を求める」</p>
</blockquote>
<p>の意味を読み取りましょう。</p>
<p>c1 を &#8220;n&#8221; 、 c2 を &#8220;f&#8221; とした場合、 &#8220;nf&#8221; の出現回数 ÷ ( &#8220;n&#8221; の出現回数 &#8211; 末尾に &#8220;n&#8221; が出現する回数) を求めればよいことがわかります。</p>
<p>プログラムを見ると、文字 c1 を文字列 s1 に変換し、文字 c2 を文字列 s2 に変換しています。 これは、<span class="u">文字と文字列を区別するプログラミング言語を想定している</span>のでしょう。問題文に</p>
<blockquote>
<p class="grey-text">「文字列に対する演算子 &#8220;+&#8221; は、文字列の連結を表す」</p>
</blockquote>
<p>とあるので、 s1 + s2 は、 &#8220;nf&#8221; という文字列になります。</p>
<p>&nbsp;</p>
<p>問題に示された表に、</p>
<dl class="">
<dt>freq(文字列型：str)メソッド</dt>
<dd>「英単語群中の文字列 str の出現回数を返す」</dd>
<dt>freqE(文字列型：str)メソッド</dt>
<dd>「英単語群の中で、文字列 str で終わる英単語の数を返す」</dd>
</dl>
<p>という説明があります。</p>
<p>したがって、 &#8220;nf&#8221; の出現回数 ÷ (&#8220;n&#8221;の出現回数 &#8211; 末尾に &#8220;n&#8221; が出現する回数) は、</p>
<pre>words.freq(s1 + s2) ÷ (words.freq(s1) - words.freqE(s1))</pre>
<p>となり、選択肢ウが正解です。</p>
<p>&nbsp;</p>
<p>もしも、このサンプル問題と同様の問題が従来の午後試験で出題されたとしたら、配列に格納された文字列をコツコツと処理するプログラムが示されたはずです。 それがライブラリを利用するプログラムになっているのですから、<span class="u">科目 B 試験のアルゴリズムとプログラミングの問題は、従来よりも解きやすくなった（やさしくなった）といえます</span>。</p>
<p>ただし、<span class="bold">まったくプログラミング経験がないと、問題の意味がわからない</span>でしょう。</p>
<p>試験対策として、 <span class="u">Java や Python など、ライブラリを活用するプログラミング言語を学習しておくべき</span>です。 科目 B 試験には、プログラミング言語の問題がありませんが、プログラミング言語の知識と経験が要求されます。</p>
<div class="chip mag_tp50">サンプル問題の正解</div>
<p>問 4 － イ　問 5－ ウ</p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>以上、「基本情報技術者試験 科目 B 試験のサンプル問題」の中から、アルゴリズムとプログラミングの問題を取り上げて、解法のポイントを説明しました。 2023 年 4 月以降に基本情報技術者試験を受験される方の参考になれば幸いです。</p>
<p>科目 B のサンプル問題には、情報セキュリティの問題もあります。この問題は、今後の記事で取り上げる予定です。</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/new_algorithm_and_programming_2/">新・基本情報 科目 B アルゴリズムとプログラミング サンプル問題 解説 2</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python 最終回 試験問題レベルにチャレンジ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/</link>
		<pubDate>Sun, 16 Jan 2022 23:30:32 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6354</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 前回までで、試験の出題範囲をほぼ網羅して学習できました。最終回 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/">基本情報ではじめる Python 最終回 試験問題レベルにチャレンジ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>前回までで、試験の出題範囲をほぼ網羅して学習できました。最終回となる今回は、総仕上げとして、試験問題レベルの Python のプログラムにチャレンジしてみましょう。</p>
<div class="background red-text small-text pink-text">
<i class="material-icons">report</i>現時点で、 Python の過去問題は公開されていません。この記事に示した問題は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_2/2017h29a_fe_pm_qs.pdf#page=46" rel="noopener" target="_blank">平成 29 年度 秋期 の C 言語</a>の問題の一部を Python に置き換えたものです。
</div>
<style>article{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}@media screen and (max-width:600px){dd{margin-left:1em}ol.background{padding-left:3em!important}}</style>
<h2>問題</h2>
<p>　次の Python プログラムの説明及びプログラムを読んで、設問に答えよ。</p>
<p>〔問題〕</p>
<p>　文字列の中から、回文（ palindrome ）を探して表示する関数 find_palindrome である。回文とは、先頭から読んだ文字の並びと末尾から読んだ文字の並びが一致する文字の並びのことである。ただし、ここでは次の条件を満たすものとする。</p>
<ul class="background c-round">
<li>文字列は英字（ A ～ Z、 a ～ z ）、数字（ 0 ～ 9 ）、記号（ !&#8221;#%&#038;'()*+、-./:+&lt;=>?[]^_{|} ）及び空白文字から成る。</li>
<li>文字の並びを読むとき、英字の大文字と小文字は区別しない。</li>
<li>文字の並びを読むとき、記号及び空白文字は無視する。</li>
<li>回文は英数字で始まり英数字で終わる。ただし、英数字 1 文字は回文ではない。</li>
</ul>
<p>　本問のプログラムが表示する回文の例を表 1 に示す。 No.1 で示す文字列において、文字の並び bc0cb は回文である。 c0c も回文であるが、本問のプログラムでは、文字列の先頭に最も近い文字から始まるものを表示する。また、 No.2 で示す文字列において、英字の大文字と小文字は区別しないので、文字の並び Bc0Cb は回文である。さらに、 No.3 で示す文字列において、英字の大文字と小文字を区別せず、かつ、記号及び空白文字を無視するので、文字の並び B!c0Cb は回文である。 No.4 で示す文字列において、文字列の先頭に最も近い b を先頭文字とする文字の並び bc0cb と bc0cb1bc0cb は、いずれも回文である。しかし、本問のプログラムでは、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。</p>
<table class="centered responsive-width">
<caption>表 1　本問のプログラムが表示する回文の例</caption>
<thead>
<tr>
<th>No.</th>
<th>文字列</th>
<th>表示する回文</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>abc0cbe</td>
<td>bc0cb</td>
</tr>
<tr>
<td>2</td>
<td>ABc0CbE</td>
<td>Bc0Cb</td>
</tr>
<tr>
<td>3</td>
<td>AB!c0 CbE</td>
<td>B!c0 Cb</td>
</tr>
<tr>
<td>4</td>
<td>abc0cb1bc0cbe</td>
<td>bc0cb</td>
</tr>
<tbody>
</table>
<ol class="mag_h30">
<li>関数 find_palindrome の仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字列 text の中から、回文を探して表示する。文字列 text の中に複数の回文がある場合、先頭文字位置が文字列の先頭に最も近いものを表示する。さらに、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。</dd>
<dt class="chip">引数</dt>
<dd>text	文字列</dd>
</dl>
<p>　関数 find_palindrome は、関数 is_palindrome 及び関数 find_char を使用する。
</li>
<li>関数 is_palindrome の仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字の並び chars の idx 以降が回文かどうかを判定する。</dd>
<dt class="chip">引数</dt>
<dd>chars	文字の並び</dd>
<dd>idx	チェックする先頭位置の添え字</dd>
<dd>size	チェックする文字数</dd>
<dt class="chip">返却値</dt>
<dd>回文の場合は 1</dd>
<dd>回文でない場合は 0</dd>
</dl>
</li>
<li>関数find_charの仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字列 st の idx 以降で、文字 ch が最初に現れる位置を求める。ただし、英字の大文字と小文字は区別しない。</dd>
<dt class="chip">引数</dt>
<dd>st	文字列</dd>
<dd>idx	チェックする先頭位置の添え字</dd>
<dd>ch	文字</dd>
<dt class="chip">返却値</dt>
<dd>文字 ch が現れる場合は、それが最初に現れる位置の添え字</dd>
<dd>文字 ch が現れない場合は、 -1</dd>
</dl>
</li>
<li>プログラム中で使用している組み込み関数やメソッドの概要は、次のとおりである。
<dl class="background c-round">
<dt>s.isalnum()</dt>
<dd>文字列sの内容がすべて英数字のとき、Trueを返し、それ以外のとき、Falseを返す。</dd>
<dt>s.lower()</dt>
<dd>文字列sの中にあるすべての英大文字を、英小文字に変換した文字列を返す。</dd>
<dt>print(s, end = &#8220;&#8221;)</dt>
<dd>文字列sを表示して、改行しない。</dd>
</dl>
</li>
</ol>
<p>〔プログラム〕</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<pre class="line-numbers"><code class="language-py">def find_palindrome(text):
    for i in range(len(text)):
        if not text[i].isalnum():
            continue
        # ithは、文字列textの第i文字の添え字
        ith = i
        # hitは、第i文字と一致した文字の添え字
        hit = find_char(text, ith + 1, text[ith]) 
        while hit != -1:
            # psizeは、文字の並びの長さ
            psize = "［　　a　　］"
            if is_palindrome(text, ith, psize):
                while ith < hit + 1:
                    print(text[ith], end = "")
                    ith += 1
                print()
                return
            hit = find_char(text, hit + 1, text[ith])

def is_palindrome(chars, idx, size):
    l = idx
    r = idx + size - 1
    while l < r:
        while not chars[l].isalnum():
            l += 1
        while not chars[r].isalnum():
            r -= 1
        if "［　　b　　］":
            return 0
        l += 1
        r -= 1
    return 1

def find_char(st, idx, ch):
    for i in range(idx, len(st)):
        if "［　　c　　］":
          return i
    return -1</code></pre>
<p class="bold">設問</p>
<p>プログラム中の<span class="bold mag_w05">［　　　　　］</span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群</p>
<pre><code class="language-py">ア　i			
イ　ith			
ウ　ith + 1
エ　hit - ith		
オ　hit - ith + 1</code></pre>
<p>b に関する解答群</p>
<pre><code class="language-py">ア　l == r
イ　1 != r
ウ　chars[l] == chars[r]
エ　chars[l] != chars[r]
オ　chars[l].lower() == chars[r].lower()
カ　chars[l].lower() != chars[r].lower()</code></pre>
<p>c に関する解答群</p>
<pre><code class="language-py">ア　ch == st[i]
イ　ch != st[i]
ウ　ch.lower() == st[i].lower()
エ　ch.lower() != st[i].lower()
オ　(ch == st[i].lower()) or (ch.lower() == st[i])
カ　(ch == st[i].lower()) and (ch.lower() == st[i])</code></pre>
<div class="divider mag_h40"></div>
<h2>解答と解説</h2>
<h3>空欄 a の解説</h3>
<p>表 1 に示された「 abc0cbe 」という文字列から「 bc0cb 」という回文が表示される例を想定して、関数 find_palindrome の処理の流れを追いかけてみましょう。</p>
<ol class="background c-round">
<li>6 行目で、「 abc0cbe 」の先頭の「 a 」の添え字が変数 ith に格納されます。</li>
<li>8 行目で、「 abc0cbe 」の先頭から 1 つ先を起点とした「 bc0cbe 」という文字列から先頭の「 a 」と、同じ文字があるかどうかが関数 find_char で検索されます。<br />この場合は、見つからないので、関数 find_char の戻り値は -1 になり、それ以降にある while 文の処理は行われず、次の文字の処理に進みます。</li>
<li>6 行目で、「 abc0cbe 」の 2 文字目の「 b 」の添え字が変数 ith に格納されます。</li>
<li>8 行目で、「 abc0cbe 」の 2 文字目から 1 つ先を起点とした「 c0cbe 」という文字列から 2 文字目の「 b 」と、同じ文字があるかどうかが関数 find_char で検索されます。</br>この場合は、「 b 」が見つかり、関数 find_char の戻り値は見つかった「 b 」の位置の添え字になり、それ以降の while 文の処理に入ります。</li>
<li>11 行目で変数 psize に空欄 a の値を代入します。
<li>12 行目で変数 psize を関数 is_palindrome の第 3 引数に指定しています。関数の仕様を見ると、第 3 引数は、チェックする文字数です。<br />ここでは、「 abc0cbe 」の「 bc0cb 」という文字の並びが回文かどうかをチェックします。</li>
</ol>
<p>この文字の並びの長さは、「 bc0cb 」の先頭の「 b 」を指す添え字 ith と、末尾の「 b 」を指す添え字 hit の差、プラス 1 で求められます。したがって、空欄 a は、<code class="language-py pad_w05 mag_w05">hit - ith + 1</code>（選択肢オ）です。</p>
<h3>空欄 b の解説</h3>
<p>関数 is_palindrome では、文字列 chars を左端からたどる l と右端からたどる r を 1 つずつ変化させる while 文で、文字列 chars が回文かどうかをチェックしています。</p>
<p>左端からたどった文字は<code class="language-py pad_w05 mag_w05">chars[l]</code>であり、右端からたどった文字は<code class="language-py pad_w05 mag_w05">chars[r]</code>です。</p>
<p>&nbsp;</p>
<p>空欄 b には、関数 is_palindrome が戻り値として 0 を返す条件が入ります。関数 is_palindrome の仕様を見ると、戻り値として 0 を返すのは、文字列 chars が回文でない場合です。</p>
<p>大文字と小文字が違っても同じとみなすので、空欄 b の条件は、小文字に統一して等しくないことをチェックする<code class="language-py pad_w05 mag_w05">chars[l].lower() != chars[r].lower()</code>（選択肢カ）です。</p>
<h3>空欄 c の解説</h3>
<p>関数 find_char は、引数で指定された文字列 st から文字 ch を見つけて、最初に見つかった位置の添え字を返します。</p>
<p>空欄 c は、<code class="language-py pad_w05 mag_w05">st[i]</code>の添え字を返す処理の条件です。大文字と小文字が違っても同じとみなすので、<code class="language-py pad_w05 mag_w05">ch.lower() == st[i].lower()</code>（選択肢ウ）です。</p>
<p>&nbsp;</p>
<div class="chip">解答</div>
<p>空欄 a ― オ<br />
空欄 b ― カ<br />
空欄 c ― ウ</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>いかがでしたか。 Python のプログラムを読み取って、問題を解けましたか？</p>
<p>もしも、プログラミングの学習を始めたばかりなら、スラスラできなくても当然です。同じ問題を、何度も繰り返し練習してください。時間はかかるかもしれませんが、必ずできるようになります。</p>
<p>この連載は、今回で最終回になります。これまで連載をお読みいただいた皆様に、この場をお借りして、厚く御礼申し上げます。</p>
<p>またどこかでお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/">基本情報ではじめる Python 最終回 試験問題レベルにチャレンジ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (9) import 文とライブラリの活用</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/import/</link>
		<pubDate>Thu, 09 Dec 2021 06:30:25 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6292</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 import 文とライブラリの活用です。この [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/import/">基本情報ではじめる Python (9) import 文とライブラリの活用</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 <span class="bold">import 文とライブラリの活用</span>です。このテーマをマスターすれば、試験の出題範囲をほぼ網羅できたことになります。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<p class="title blue-text bold">（10）ライブラリの活用</p>
<p>　問題解決のために適した代表的な標準ライブラリ又は外部ライブラリを利用し，プログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>import 文，モジュール，パッケージ など
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_2.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.2</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}blockquote > p {color:#607d8b;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;scrollbar-width:thin;}.chip{height:auto;line-height:1.5;padding:6px 12px;}</style>
<h2>モジュールと import 文</h2>
<p>Python には、様々なプログラムから利用できる関数やクラスが数多く用意されていて、それらを<span class="bold">「ライブラリ」</span>と呼びます。</p>
<p>それらの中で、一般的な Python の開発環境をインストールすれば、すぐに利用できるものを<span class="u">「標準ライブラリ」</span>と呼び、必要に応じて後から追加して利用するものを<span class="u">「外部ライブラリ」</span>と呼びます。</p>
<p>ライブラリの実体は、関数やクラスなどが記述されたファイルです。このようなファイルを<span class="bold">「モジュール」</span>と呼びます。</p>
<p>&nbsp;</p>
<p><a href="../library_functions/">前回（第 8 回）で説明した「組み込み関数」</a>は、何の設定もせずに利用できましたが、<span class="u">標準ライブラリや外部ライブラリを利用するには、 import 文を使ってモジュールをインポート</span>する（モジュールを利用することを設定する）必要があります。</p>
<p>標準ライブラリである math モジュールを例にして、 import 文の使い方を説明しましょう。 math モジュールは、数学関連の様々な関数を提供します。ここでは、引数の平方根を返す sqrt 関数を使います。</p>
<p>&nbsp;</p>
<p>math モジュールを利用するには、プログラムの先頭で <code class="language-py">import math</code> を実行します。これによって、 <code class="language-py">math.関数名(引数)</code> という構文で、 math モジュールの関数を呼び出せます。</p>
<p>図 1 では、 <code class="language-py">import math</code> を実行してから、 <code class="language-py">math.sqrt(2)</code> を呼び出して、 2 の平方根を求めています。</p>
<p>この記事では、 Python の対話モードでプログラムを実行します。説明のために、プログラムの中にコメントを記入した部分がありますが、実際にプログラムを作って動作を確認するときには、これらのコメントは不要です。</p>
<div class="background blue-grey-text small-text mag_h30 c-round">
<i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか [ Shift + Enter ] で実行できます
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 1 　import 文の使い方<br />
</figcaption><pre><code class="language-py">>>> import math     # mathモジュールをインポートする
>>> math.sqrt(2)  	# mathモジュールのsqrt関数を呼び出す
1.4142135623730951  # 関数の戻り値が表示される</code></pre>
</figure>
<h2>import 文のバリエーション</h2>
<p>import 文の使い方には、いくつかのバリエーションがあります。先ほどの例では、 <code class="language-py">import math</code> で math モジュールをインポートして、 <code class="language-py">math.sqrt(2)</code> という構文で sqrt 関数を呼び出しました。</p>
<p>もしも、関数名の前に「 math 」を付けることを面倒だと感じたら、</p>
<pre><code class="language-py">from math import sqrt</code></pre>
<p>というバリエーションを使ってください。これは、</p>
<blockquote><p>math モジュールから sqrt をインポートする</p></blockquote>
<p>という意味です。これによって、関数名の前に「 math 」を付けずに <code class="language-py">sqrt(2)</code> という構文で sqrt 関数を呼び出せます。</p>
<p>図 2 に例を示します。</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 2 　import 文の使い方のバリエーション（その 1 ）<br />
</figcaption><pre><code class="language-py">>>> from math import sqrt # mathモジュールからsqrt関数をインポートする
>>> sqrt(2)               # sqrt関数を呼び出す
1.4142135623730951        # 関数の戻り値が表示される</code></pre>
</figure>
<p>モジュールの中には、「 matplotlib.pyplot 」のように長い名前になっているものもあります。もしも、長いモジュール名を使うことを面倒だと感じたら、</p>
<pre><code class="language-py">import matplotlib.pyplot as plt</code></pre>
<p>というバリエーションを使ってください。これは、</p>
<blockquote><p>matplotlib.pyplot モジュールをインポートして plt という別名を付ける</p></blockquote>
<p>という意味です。これによって、 matplotlib.pyplot という長いモジュール名を、 plt という短い別名で使えるようになります。プログラムの例は、この記事の最後に示します。</p>
<h2>パッケージ</h2>
<p>ここで、再び「 matplotlib.pyplot 」というモジュール名に注目してください。</p>
<p>「 matplotlib 」と「 pyplot 」が、ドット（ . ）でつながれています。これは、</p>
<blockquote><p>matplotlib パッケージの pyplot モジュール</p></blockquote>
<p>という意味です。<span class="u"><span class="bold">「パッケージ」</span>とは、複数のモジュールをまとめたもの</span>です。 Windows では、パッケージは、複数のファイル（モジュール）を格納したディレクトリです。</p>
<p>ライブラリの中には、パッケージの形で提供されるものもあります。これは、複数のモジュールを、まとめて提供するということです。</p>
<p>matplotlib パッケージは、グラフの描画に関する複数のモジュールを、まとめて提供します。図 3 に示したように、 matplotlib というディレクトリの中に、 pyplot.py, quiver.py, rcsetup.py など、複数のファイルがあるのです（それぞれのモジュールは、拡張子が .py となったファイルですが、インポートするときには、拡張子を省略します）。</p>
<figure><figcaption>図 3　 Windows では、パッケージはディレクトリであり、モジュールはファイルである</figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/12/path_module.jpg" loading="lazy"><br />
</figure>
<p>パッケージの中にあるモジュールをインポートするときには、 <code class="language-py">matplotlib.pyplot</code> のように「パッケージ名.モジュール名」という構文でモジュールを指定します。</p>
<h2>matplotlib.pyplot を利用したサンプルプログラム</h2>
<p>基本情報技術者試験のシラバスには、標準ライブラリや外部ライブラリの具体的な名前が明記されていません。したがって、<span class="u">何らかのライブラリを利用したプログラムが出題される場合には、モジュールの機能の説明が示されるはず</span>です。</p>
<p>情報処理推進機構 ( IPA ) が公開している <a href="https://www.jitec.ipa.go.jp/1_13download/fe_python_sample.pdf" rel="noopener" target="_blank">Python のサンプル問題</a>（現時点で、公式に公開されているのは、このサンプル問題だけです）では、 matplotlib.pyplot モジュールを利用したプログラムが出題されています。</p>
<p>モジュールの機能は、図 4 に示したようにコメントとして示されています。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 4 　サンプル問題では、ライブラリの機能をコメントで示している<br />
</figcaption><pre><code class="language-py">import matplotlib.pyplot as plt  # グラフ描画の外部ライブラリ
　：
plt.xlim(-320, 320)  # x軸の表示範囲を設定
plt.ylim(-240, 240)  # y軸の表示範囲を設定
　：
# (x1, y1)と(x2, y2)を結ぶ線分を描画
plt.plot([x1, x2], [y1, y2], color='black', linewidth=2)
　：
# 描画結果を表示
plt.show()</code></pre><figcaption>IPA が公開した <a href="https://www.jitec.ipa.go.jp/1_13download/fe_python_sample.pdf" rel="noopener" target="_blank">基本情報技術者試験（FE）午後試験 Python のサンプル問題</a><i class="material-icons red-text mag_w05">picture_as_pdf</i>より</figcaption></figure>
<p>実際に、 matplotlib.pyplot モジュールを使ってみましょう。</p>
<p>図 5 では、</p>
<p>(-300, -200),<br />
(0, 200),<br />
(300, -200),<br />
(-300, -200),</p>
<p>という 4 つの点を結んだ線分で、三角形を描画しています（ここでは、サンプル問題のプログラムとは違うコメントを記入しています）。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 5 　atplotlib.pyplot モジュールを利用したプログラム<br />
</figcaption><pre><code class="language-py"># matplotlib.pyplotをインポートしてpltという別名をつける
import matplotlib.pyplot as plt

# グラフのx軸とy軸の表示範囲を設定する
plt.xlim(-320, 320)
plt.ylim(-240, 240)

# x座標のリストとy座標のリストの点を結ぶ線分を描画する（画面には表示されない）
plt.plot([-300, 0, 300, -300], [-200, 200, -200, -200], color='black', linewidth=2)

# 描画の内容を画面に表示する
plt.show()</code></pre>
</figure>
<p>plt.plot の 1 つ目の引数には、点の x 座標のリストを指定し、 2 つ目の引数には点の y 座標のリストを指定します。</p>
<p>図 5 のプログラムの実行結果の例を図 6 に示します。</p>
<figure><figcaption></figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/12/output_figure_triangle.png" width="563" height="413" loading="lazy"><br />
</figure>
<p>matplotlib.pyplot モジュールを利用すると、このように短いプログラムでビジュアルにグラフの描画ができます。実際の試験問題でも、 matplotlib.pyplot モジュールが使われる可能性は、大いにあるでしょう。</p>
<div class="divider mag_h50"></div>
<p>第 1 回から第 9 回（今回）までの連載で、基本情報技術者試験の Python の出題範囲をほぼ網羅しました。</p>
<p>次回は、<span class="u">総仕上げとして、試験問題レベルの Python のプログラムを読むことにチャレンジ</span>します。もしも、理解が不十分なテーマがあれば、これまでの記事を読み直して復習しておいてください。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/import/">基本情報ではじめる Python (9) import 文とライブラリの活用</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (8) 組み込み関数</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/library_functions/</link>
		<pubDate>Sat, 20 Nov 2021 02:30:06 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6252</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 Python の組み込み関数です。簡単なサン [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/library_functions/">基本情報ではじめる Python (8) 組み込み関数</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 <span class="bold">Python の組み込み関数</span>です。簡単なサンプルプログラムの動作を確認することで、試験のシラバスに示された組み込み関数の種類と機能を、一気に理解しましょう。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<p class="title blue-text bold">（6）組込み関数</p>
<p>　型、リスト、文字列の入出力、ファイル操作などに関する組込み関数の利用場面を理解し、プログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>int, float, str, list, range, enumerate, zip, len, print, input, open  など
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_2.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.2</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}table{font-size:.85em;}td{vertical-align:top;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;scrollbar-width:thin;}@media screen and (min-width:601px){.responsive-width{width:60%}}</style>
<h2>Python の組み込み関数の種類</h2>
<p>Python のプログラミング環境には、膨大な数の関数が用意されています。それらの中で、<span class="u">インポート（ import 文を使って使用を宣言すること）なしですぐに使える関数を<span class="bold">「組み込み関数」</span>と呼びます</span>。</p>
<p>図 1 は、 Python の組み込み関数の一覧です。赤色で示した関数は、試験のシラバスに示されているものです。これらを一気に理解することが、今回のテーマです。</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、表は横スクロールすると全文をご覧になれます
</div>
<div class="table-container">
<table>
<tr>
<td><span class="bold">A</span><br />
abs()<br />
aiter()<br />
all()<br />
any()<br />
anext()<br />
ascii()</p>
<p><span class="bold">B</span><br />
bin()<br />
bool()<br />
breakpoint()<br />
bytearray()<br />
bytes()</p>
<p><span class="bold">C</span><br />
callable()<br />
chr()<br />
classmethod()<br />
compile()<br />
complex()</p>
<p><span class="bold">D</span><br />
delattr()<br />
dict()<br />
dir()<br />
divmod()</td>
<td><span class="bold">E</span><br />
<span class="red-text">enumerate()</span><br />
eval()<br />
exec()</p>
<p><span class="bold">F</span><br />
filter()<br />
<span class="red-text">float()</span><br />
format()<br />
frozenset()</p>
<p><span class="bold">G</span><br />
getattr()<br />
globals()</p>
<p><span class="bold">H</span><br />
hasattr()<br />
hash()<br />
help()<br />
hex()</p>
<p><span class="bold">I</span><br />
id()<br />
<span class="red-text">input()</span><br />
<span class="red-text">int()</span><br />
isinstance()<br />
issubclass()<br />
iter()</td>
<td><span class="bold">L</span><br />
<span class="red-text">len()</span><br />
<span class="red-text">list()</span><br />
locals()</p>
<p><span class="bold">M</span><br />
map()<br />
max()<br />
memoryview()<br />
min()</p>
<p><span class="bold">N</span><br />
next()</p>
<p><span class="bold">O</span><br />
object()<br />
oct()<br />
<span class="red-text">open()</span><br />
ord()</p>
<p><span class="bold">P</span><br />
pow()<br />
<span class="red-text">print()</span><br />
property()</td>
<td><span class="bold">R</span><br />
<span class="red-text">range()</span><br />
repr()<br />
reversed()<br />
round()</p>
<p><span class="bold">S</span><br />
set()<br />
setattr()<br />
slice()<br />
sorted()<br />
staticmethod()<br />
<span class="red-text">str()</span><br />
sum()<br />
super()</p>
<p><span class="bold">T</span><br />
tuple()<br />
type()</p>
<p><span class="bold">V</span><br />
vars()</p>
<p><span class="bold">Z</span><br />
<span class="red-text">zip()</span></p>
<p>その他<br />
__import__()</td>
</tr>
</table>
</div>
<p>組み込み関数の機能を理解するには、実際に使ってみることが一番です。</p>
<p>これ以降では、 Python の対話モードで、組み込み関数を使った簡単なサンプルプログラムを動作させます。プログラムの動作結果を見て、関数の名前（名前の意味も説明します）と機能を対応付けてください。</p>
<p>プログラムには、説明の都合でコメント（ # で始まる文字列）を付けている部分がありますが、実際にプログラムを作って動作させるときには、これらのコメントは不要です。</p>
<div class="background blue-grey-text small-text mag_h30 c-round">
<i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか [ Shift + Enter ] で実行できます
</div>
<h2>int 関数</h2>
<p>int 関数は、 integer （整数）という意味です。 int 関数は、引数で指定された数字列（文字列）を整数に変換して返します。</p>
<p>図 2 は、変数 s1 と s2 に適当な数字列を代入し、それらを int 関数で整数に変換して加算するプログラムです。</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 2 　数字列を整数に変換して加算するプログラム<br />
</figcaption><pre><code class="language-py">>>> s1 = "123"		    # 変数s1に適当な数字列を代入する
>>> s2 = "456"		    # 変数s2に適当な数字列を代入する
>>> int(s1) + int(s2)	# 変数s1とs2の内容を整数に変換して加算する
579                     # 加算結果が得られる</code></pre>
</figure>
<p>このように、 int 関数は、数字列を整数に変換して演算する場面で、よく使われます。</p>
<h2>float 関数</h2>
<p>float 関数は、 floating point number （浮動小数点数）という意味です。 float 関数は、引数で指定された数字列（文字列）を浮動小数点数に変換して返します。</p>
<p>図 3 は、変数 s1 と s2 に適当な数字列を代入し、それらを float 関数で浮動小数点数に変換して加算するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 3 　数字列を浮動小数点数に変換して加算するプログラム<br />
</figcaption><pre><code class="language-py">>>> s1 = "1.23"             # 変数s1に適当な数字列を代入する
>>> s2 = "4.56"             # 変数s2に適当な数字列を代入する
>>> float(s1) + float(s2)   # 変数s1とs2の内容を浮動小数点数に変換して加算する
5.789999999999999           # 加算結果が得られる</code></pre>
</figure>
<p>このように、 float 関数は、数字列を浮動小数点数に変換して演算する場面で、よく使われます。</p>
<h2>str 関数</h2>
<p>str 関数は、 string （文字列）という意味です。 str 関数は、引数で指定されたオブジェクトを文字列に変換して返します。</p>
<p>図 4 は、変数 pi に代入された 3.14 という数値を str 関数で文字列に変換し、 &#8220;円周率 = &#8221; という文字列に連結するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 4 　数値を文字列に変換して他の文字列に連結するプログラム<br />
</figcaption><pre><code class="language-py">>>> pi = 3.14               # 変数piに数値を代入する
>>> "円周率 = " + str(pi)	# 数値を文字列に変換して連結する
'円周率 = 3.14'             # 連結した結果が表示される</code></pre>
</figure>
<p>このように、 str 関数は、数値を文字列に変換して他の文字列に連結する場面で、よく使われます。</p>
<h2>list 関数</h2>
<p>list 関数は、 list （ <span class="u">Python のリストとは C 言語や Java などの配列に相当するもの</span>）という意味です。 list 関数は、引数で指定されたオブジェクトをリストに変換して返します。</p>
<p>図 5 は、 &#8220;hello&#8221; という文字列を list 関数でリストに変換するプログラムです。文字列を構成する 1 つの文字が要素となったリストが得られます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 5 　文字列をリストに変換するプログラム<br />
</figcaption><pre><code class="language-py">>>> list("hello")		    # 文字列をリストに変換する
['h', 'e', 'l', 'l', 'o']	# リストの内容が表示される</code></pre>
</figure>
<h2>range 関数</h2>
<p>range 関数は、 range（範囲）という意味です。 range 関数は、<span class="u">主に for 文の in の後で使われ、引数で指定された範囲の整数列を順番に返します</span>。</p>
<p>図 6 は、 range 関数を使って得られた 0 から 10 未満までの整数列を表示するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 6 　0 から 10 未満までの整数列を表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> for i in range(0, 10):	# for文のinの後でrange関数を使う
...     print(i)            # 変数iに得られた値を表示する
...                         # ［Enter］キーだけを押す
0                           # 0から10未満の値が表示される
1
2
3
4
5
6
7
8
9</code></pre>
</figure>
<h2>enumerate 関数</h2>
<p>enumerate 関数は、 enumerate （数え上げる、列挙する）という意味です。</p>
<p>enumerate 関数は、引数で指定されたイテラブル（リスト、タプル、文字列、など）の要素に、<span class="u">添字を割り当てます</span>。 for 文の in の後でenumerate 関数を使うと、添字と要素が順番に取り出されます。</p>
<p>図 7 は、 <code class="language-py">["apple", "orange", "grape"]</code> というリストの要素に添字を割り当てた結果を表示するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 7 　文字列のリストの要素に添字を割り当てた結果を表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> for i, s in enumerate(["apple", "orange", "grape"]):　# for文のinの後でenumerate関数を使う
...     print(i, s)	                                      # 変数iに得られた添字と、変数sに得られた要素を表示する
...                                                       # ［Enter］キーだけを押す
0 apple                                                   # 添字と要素が表示される
1 orange
2 grape</code></pre>
</figure>
<h2>zip 関数</h2>
<p>zip 関数は、 zip （ジッパーで閉じる）という意味です。</p>
<p>zip 関数は、引数で指定された<span class="u">複数のイテラブル（リスト、タプル、文字列、など）から要素を取り出し、それらをタプルにまとめます（タプルに閉じます）</span>。 for 文の in の後で zip 関数を使うと、 zip 関数の引数に指定された複数のイテラブルから順番に要素が取り出され、それらがタプルに連結されます。</p>
<p>図 8 は、 <code class="language-py">["apple", "orange", "grape"]</code> および <code class="language-py">[100, 200, 300]</code> という 2 つのリストの要素をタプルに閉じて取り出すプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 8 　 2 つのリストの要素をタプルに閉じて取り出すプログラム<br />
</figcaption><pre><code class="language-py">>>> for t in zip(["apple", "orange", "grape"], [100, 200, 300]):  # for文のinの後でzip関数を使う
...     print(t)                                                  # タプルに閉じられた結果を表示する
...                                                               # ［Ener］キーだけを押す
('apple', 100)                                                    # タプルに閉じられた要素が表示される
('orange', 200)
('grape', 300)</code></pre>
</figure>
<h2>len 関数</h2>
<p>len 関数は、 length （長さ）という意味です。 len 関数は、引数で指定されたイテラブル（リスト、タプル、文字列、など）の<span class="u">要素数を返します</span>。</p>
<p>図 9 は、リストと文字列の要素数を表示するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 9 　リストと文字列の要素数を表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> len([100, 200, 300])	# リストの要素数を得る
3                           # 要素数が表示される
>>> len("hello")	      	# 文字列の要素数を得る
5                           # 要素数が表示される</code></pre>
</figure>
<h2>print 関数</h2>
<p>print 関数は、 print （印刷する）という意味です。 print 関数は、引数で指定されたデータを画面に表示します。</p>
<p>引数には、カンマで区切って複数のデータを指定することもできます。<br />
引数 sep に、データを区切る文字（デフォルトは、空白文字）を指定することもできます。<br />
引数 end に、末尾に表示する文字（デフォルトは、改行文字）を指定することもできます。</p>
<p>図 10 は、変数 a, b, c の値をカンマで区切って画面に表示するプログラムです。 Python の対話モードでは、 print 関数を使わなくても、変数の値を入力して ［Enter］ キーを押すだけで、変数の値が画面に表示されます。 print 関数は、主に Python の実行モードで使われます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 10 　変数 a の値を画面に表示するプログラム<br />
</figcaption><pre><code class="language-py">>>> a = 123			            # 変数aに適当な値を代入する
>>> b = 456			            # 変数bに適当な値を代入する
>>> c = 789			            # 変数cに適当な値を代入する
>>> print(a, b, c, sep=",")	    # 区切り文字にカンマを指定する
123,456,789			            # 変数a、b、cの値がカンマで区切られて表示される</code></pre>
</figure>
<h2>input 関数</h2>
<p>input 関数は、 input （入力する）という意味です。 input 関数は、<span class="u">キーボード入力された文字列を返します</span>。 input 関数の引数に文字列を指定すると、それがプロンプト（入力を促す文字列）として表示された後でキー入力が行われます。</p>
<p>図11は、 <code class="language-py">"s -->"</code> というプロンプトを表示した後でキー入力を行い、それを変数 s に代入するプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 11 　キー入力を変数に代入するプログラム<br />
</figcaption><pre><code class="language-py">>>> s = input("s -->")	# キーボード入力を変数sに代入する
s -->hello              # 適当な文字列を入力する
>>> s                   # 変数sの内容を確認する
'hello'                 # キー入力した文字列が格納されている</code></pre>
</figure>
<h2>open 関数</h2>
<p>open 関数は、 open （開く）という意味です。 open 関数は、引数で指定されたファイルを開き、そのファイルを操作するための<span class="u">ファイルオブジェクトを返します</span>。</p>
<p>図 12 は、 sample.txt というテキストファイルの内容（果物の名前を 3 つ記述した内容で作成してあります）を読み出して、画面に表示するプログラムです。</p>
<p>open 関数の<span class="u">第 1 引数でファイル名を指定</span>し、<span class="u">第 2 引数でモードを指定</span>します。<code class="language-py">"rt"</code> というモードは、 read text （テキストファイルの読み出し）を意味しています。</p>
<p>open 関数が返すファイルオブジェクトには、<span class="u">イテレータの機能（データを順番に取り出す機能）があります</span>。そのため、 for 文の in の後にファイルオブジェクトを指定すると、テキストファイルから 1 行ずつ文字列を読み出せます。</p>
<p>ファイルの操作が終わったら、ファイルオブジェクトが持つ close メソッドでファイルを閉じます。 print 関数の引数 end に空文字列を指定しているのは、ファイルから読み出した文字列の末尾に改行文字があるので、表示する際に改行が重複しないようにするためです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 12 　テキストファイルの内容を読み出して画面に表示するプログラム<br />
</figcaption><pre><code class="language-py">
>>> file_object = open("sample.txt", "rt")	# ファイルを開く
>>> for s in file_object:                   # ファイルから1行ずつ読み出す
...     print(s, end="")			        # 画面に表示する
...                                         # ［Enter］キーだけ押す
apple                                       # ファイルの内容が表示される
orange
grape
>>> file_object.close()				        # ファイルを閉じる</code></pre>
<div class="background c-round grey-text"><i class="material-icons indigo-text mag_rt05">info</i>編集部注<br />
JupyterLab をご利用の場合は、上記コードを実行するにあたり sample.txt のファイルパスがわかりくく、うまく実行できないかも知れません。その場合は以下のようにすると動作します。<br />
なお、ファイルアップロードはメニュー下のボタンから出来ます。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/11/upload_btn.jpg" loading="lazy"><br />
</figre>
</div>
<figure><figcaption class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>図 13 　図 12 を JupyterLab で実行するときのスニペット<br />
</figcaption><pre><code class="language-py">>>> import os                                                 # os のインターフェイスを扱うライブラリをインポート
>>> os.path.expanduser("~")                                   # ホームディレクトリのパスを表示
'/home/jovyan'                                                # 出力が異なることもあります。編集部が実行した際は '/home/jovyan' というパスが出力されました
>>> file_object = open("/home/jovyan/demo/sample.txt", "rt")  # 得られたパスに /demo/sample.txt を追加
# 以下は同じコード</code></pre>
<p></figre></p>
<div class="divider mag_h50"></div>
<p>IT 業界には、様々なプログラミング言語がありますが、それぞれの言語が、その言語独自の組み込み関数（または、それに相当するもの）を備えています。組み込み関数を使うことで、そのプログラミング言語らしさが表現されます。</p>
<p>したがって、試験問題の Python のプログラムでは、 Python の組み込み関数が多用されるはずです。組み込み関数の種類と機能を、しっかりと理解してください。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/library_functions/">基本情報ではじめる Python (8) 組み込み関数</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (7) generator と yield 文</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/generator_yield/</link>
		<pubDate>Tue, 05 Oct 2021 03:22:43 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6033</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、ジェネレータと yield 文 です。やや高度 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/generator_yield/">基本情報ではじめる Python (7) generator と yield 文</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、<span class="bold">ジェネレータと yield 文</span> です。やや高度なテーマなのですが、前回のラムダ式と同様に、試験の出題範囲を示したシラバスにあるものなので、しっかりとマスターしておきましょう。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<span class="title blue-text"><br />
<strong>（7）関数の定義</strong><br />
</span><br />
利用者の定義による関数を用いて構造化されたプログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>def 文，return 文，<span class="red-border">ジェネレータ，yield 文</span>，ラムダ式，再帰呼出し，デコレータなど
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_2.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.2</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}</style>
<h2>ジェネレータとは？</h2>
<p>Python では、以下のように、 for 文の in の後にリストやタプルなどのイテラブル（複数の要素を反復して取り出せるオブジェクト）を置くと、要素が 1 つずつ取り出されます。</p>
<p>この記事で示すプログラムは、 Python の対話モードで実行しています。説明の都合で、プログラムの行末にコメントを付けていますが、実際にプログラムを動作させるときには、これらのコメントは不要です。</p>
<div class="background blue-grey-text small-text mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<div class="background small-text mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます</p>
</div>
<pre><code class="language-py">>>> animals = ['dog', 'cat', 'mouse']	# リストを作成する
>>> for a in animals:			        # for文で要素を1つずつ取り出す
...     print(a)			            # 要素を表示する
...					                    # ［Enter］キーだけを押す
dog					                    # 実行結果が表示される
cat
mouse</code></pre>
<pre><code class="language-py">>>> numbers = (111, 222, 333)	# タプルを作成する
>>> for n in numbers:			# for文で要素を1つずつ取り出す
...     print(n)			    # 要素を表示する
...					            # ［Enter］キーだけを押す
111					            # 実行結果が表示される
222
333</code></pre>
<p>リストやタプルは、あらかじめ Python に組込まれているものですが、<span class="u">それらと同様の機能を持つオブジェクトを独自に作成</span>することができ、これを<span class="bold">ジェネレータ</span>と呼びます。</p>
<p>ジェネレータ（ generator ）は、「生成装置」という意味です。ジェネレータは、複数の要素を反復して取り出せるオブジェクトです。リストやタプルと同様に、 for 文の in の後にジェネレータを置くことができます。</p>
<h2>ジェネレータ関数と yield 文</h2>
<p>ジェネレータは、ジェネレータ関数によって作成されます。これは、言葉で説明するより、具体例を示した方が早いでしょう。</p>
<p>以下は、 <code class="language-py">'dog'</code> 、 <code class="language-py">'cat'</code> 、 <code class="language-py">'mouse'</code> という文字列を順番に返す animal_generator というジェネレータ関数の定義です。</p>
<p>通常の関数では、戻り値を return 文で返しますが、<span class="u">ジェネレータ関数では、 <span class="bold">yield 文</span>で返します</span>。 yield は、「生産する」という意味です。 3 つ並んだ yield 文は、要素を反復して取り出すときに、上から順に実行されます。</p>
<pre><code class="language-py">>>> def animal_generator():	# ジェネレータ関数の定義
...     yield 'dog'		    # 1つ目の要素を返す
...     yield 'cat'		    # 2つ目の要素を返す
...     yield 'mouse'	    # 3つ目の要素を返す
...				            # ［Enter］キーだけを押す</code></pre>
<p><code class="language-py">戻り値 = ジェネレータ関数()</code> という構文でジェネレータ関数を呼び出すと、戻り値としてジェネレータが得られます。</p>
<p>以下では、</p>
<pre><code class="language-py">animal = animal_generator()</code></pre>
<p>の部分で、 animal_generator 関数が返したジェネレータを、 animal に格納しています。この animal を for 文の in の後に置くと、要素を 1 つずつ得ることができます。</p>
<pre><code class="language-py">>>> animal = animal_generator()	# ジェネレータオブジェクトを得る
>>> for a in animal:            # for文で要素を1つずつ取り出す
...     print(a)		        # 要素を表示する
...				                # ［Enter］キーだけを押す
dog				                # 実行結果が表示される
cat
mouse</code></pre>
<p>以下のように、ジェネレータ関数を for 文の in の後に置くこともできます。</p>
<pre><code class="language-py">>>> for a in animal_generator():	# ジェネレータ関数をfor文のinの後に置く
...     print(a)	                # 要素を表示する
...					                # ［Enter］キーだけを押す
dog					                # 実行結果が表示される
cat
mouse</code></pre>
<p>Python の組み込み関数である list 関数の引数にジェネレータ関数の呼び出しを置くと、ジェネレータが返す要素をリストに変換することもできます。</p>
<pre><code class="language-py">>>> animals = list(animal_generator())	# ジェネレータの要素をリストに変換する
>>> animals				                # リストの内容を表示する
['dog', 'cat', 'mouse']		            # 実行結果が表示される</code></pre>
<h2>繰り返し処理の中で yield 文を使う</h2>
<p>プログラム（すぐ後で例を示します）を見ると不思議な感じがするかもしれませんが、ジェネレータ関数に繰り返し処理を記述して、その中で yield 文を使うこともできます。</p>
<p>この場合には、<span class="u">繰り返し処理がまとめて実行されるのではなく、ジェネレータ関数が返したジェネレータから要素が 1 つずつ取り出されるときに、繰り返し処理の中にある yield 文が 1 回ずつ呼び出されます</span>。</p>
<p>&nbsp;</p>
<p>以下は、 Python の組み込み関数である range 関数と同様の機能を持つ、 <code class="language-py">range_generator(start, stop, step)</code> というジェネレータ関数の定義です。</p>
<p>start から stop 未満まで step 間隔の値を返します。 <span class="u">while 文の繰り返し処理の中に yield 文があることに注目</span>してください。この yield 文は、ジェネレータから要素が 1 つずつ取り出されるときに、 1 回ずつ呼び出されます。</p>
<pre><code class="language-py">>>> def range_generator(start, stop, step):	# ジェネレータ関数の定義
...     n = start
...     while n < stop:
...         yield n				            # ここに注目！
...         n += step
...						                    # ［Enter］キーだけを押す</code></pre>
<p>以下は、 for 文の in の後に、 <code class="language-py">range_generator(0, 10, 1)</code> を置き、ジェネレータから取り出した要素を表示するプログラムです。 0 から 10 未満まで 1 間隔の値が順番に得られています。</p>
<pre><code class="language-py">for i in range_generator(0, 10, 1):	# ジェネレータ関数をfor文のinの後に置く
...     print(i)			        # 要素を表示する
...					                # ［Enter］キーだけを押す
0					                # 実行結果が表示される
1
2
3
4
5
6
7
8
9</code></pre>
<h2>ジェネレータが役立つ場面（その 1 ）</h2>
<p><span class="u">ジェネレータは、要素が要求される場面でその都度データを産出する（ yield する）ので、メモリを多く消費しないという利点</span>があります。</p>
<p>たとえば、学生時代の数学の教科書に掲載されていた 1 ～ 100 の平方表（ 1 ～ 100 を 2 乗した値の一覧表）を返す関数を作成するとしましょう。以下のように、 1 ～ 100 の平方表のリストを返す関数（ジェネレータ関数ではない通常の関数）として作成すると、リストの大きさ分のメモリを消費します。</p>
<pre><code class="language-py">>>> def square_func():			    # 平方表のリストを返す関数の定義
...     sq_list = []			    # 空のリストを作成する
...     n = 1
...     while n <= 100:
...         sq_list.append(n ** 2)	# リストに要素を追加する
...         n += 1
...     return sq_list			    # 要素数100個のリストを返す
...					                # ［Enter］キーだけを押す</code></pre>
<pre><code class="language-py">>>> for data in square_func():	# 要素を1つずつ取り出す
...     print(data)			    # 要素を表示する
...					            # ［Enter］キーだけを押す
1					            # 実行結果が表示される
4
9
16
25
#　中　略
9604
9801
10000</code></pre>
<p>同じ目的の関数を、以下のようにジェネレータ関数として作成すれば、要素が要求される場面でその都度データを算出するので、メモリを多く消費しません。</p>
<pre><code class="language-py">>>> def square_generator():		# ジェネレータ関数の定義
...     n = 1
...     while n <= 100:
...         yield n ** 2		# 平方の値を算出する
...         n += 1
...					            # ［Enter］キーだけを押す</code></pre>
<pre><code class="language-py">>>> for data in square_generator():	# 要素を1つずつ取り出す
...     print(data)			        # 要素を表示する
...					                # ［Enter］キーだけを押す
1					                # 実行結果が表示される
4
9
16
25
#　中　略
9604
9801
10000</code></pre>
<h2>ジェネレータが役立つ場面（その 2 ）</h2>
<p>ジェネレータ関数は、現在の状態を保持できる関数だといえます。したがって、<span class="u">直前に算出したデータの値を、次に算出するデータの演算で使う、ということができます</span>。これは、通常の関数には、できないことです。通常の関数は、呼び出されるたびに、まっさらな状態で処理を行うからです。</p>
<p>以下は、 1 から 100 までの階乗を算出するジェネレータ関数 fact_generator の定義です。直前に算出したデータの値を変数 prev に格納しているので、変数 n の階乗を prev * n という演算で求めることができます。</p>
<pre><code class="language-py">>>> def fact_generator():		# ジェネレータ関数の定義
...     prev = 1			    # 直前の値の初期値
...     n = 1				    # 現在の値の初期値
...     while n <= 10:
...         fact = prev * n		# nの階乗を演算する
...         yield fact			# nの階乗を算出する
...         prev = fact			# 直前に産出した値を記憶する
...         n += 1
...					            # ［Enter］キーだけを押す</code></pre>
<pre><code class="language-py">>>> for data in fact_generator():	# 要素を1つずつ取り出す
...     print(data)			        # 要素を表示する
...					                # ［Enter］キーだけを押す
1					                # 実行結果が表示される
2
6
24
120
720
5040
40320
362880
3628800</code></pre>
<div class="divider mag_h50"></div>
<p>いかがでしたか。ジェネレータと yield 文の機能を、しっかりとマスターできたでしょう。</p>
<p>なお、<span class="u">リストやタプルからの要素の取り出しは、ジェネレータではなく、同様の機能をクラスで定義したイテレータで実現</span>されています。イテレータの作り方に関するキーワードは、基本情報技術者試験のシラバスに示されていなので、この連載では取り上げませんが、興味がある人は、ぜひ調べてみてください。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/generator_yield/">基本情報ではじめる Python (7) generator と yield 文</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (6) ラムダ式 って何？ どんな用途で使うの？</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/lambda/</link>
		<pubDate>Tue, 21 Sep 2021 02:30:01 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5944</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、ラムダ式です。かなり高度なテーマですが、試験の [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/lambda/">基本情報ではじめる Python (6) ラムダ式 って何？ どんな用途で使うの？</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、<span class="bold">ラムダ式</span>です。かなり高度なテーマですが、試験の出題範囲を示したシラバスにあるものなので、しっかりとマスターしておきましょう。</p>
<ul class="collection mag_h30">
<li class="collection-item">
<span class="title blue-text"><br />
<strong>（7）関数の定義</strong><br />
</span><br />
利用者の定義による関数を用いて構造化されたプログラムを作成する。</p>
<div class="chip">修得項目</div>
<p>def 文，return 文，ジェネレータ，yield 文，<span class="red-border">ラムダ式</span>，再帰呼出し，デコレータなど
</li>
</ul>
<p class="grey-text small-text mag_tp10"><span class="chip mag_rt05">出典</span><a href="https://www.jitec.ipa.go.jp/1_13download/syllabus_fe_ver7_1.pdf#page=19" rel="noopener" target="_blank">基本情報技術者試験シラバス Ver.7.1</a> より</p>
<style>.red-border{border:.2em solid #f44336;padding:.5em;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}</style>
<h2>ラムダ式とは？</h2>
<p>ラムダ式は、ラムダ計算をベースにしています。ラムダ計算は、コンピュータの動作を関数で抽象化するものであり、関数を λ（ラムダ） という文字を使って表すことから、その名前が付けられました。ラムダ計算には、様々なトピックがありますが、 Python のラムダ式は、それらの中の一部分だけを使っています。</p>
<p>あらかじめ結論を言ってしまうと、 <span class="bold">Python のラムダ式は、無名関数</span>です。</p>
<p>&nbsp;</p>
<p>無名関数は、名前のない関数です。 Python では、<span class="u">関数を定義するときに、一般的に def 文を使いますが、もう 1 つ別の方法としてラムダ式がある</span>のです。ラムダ式によって無名関数が作られるのです。</p>
<p>例を示しましょう。<br />
以下は、<br />
底辺 × 高さ ÷ 2<br />
という計算で、三角形の面積を求める関数を def 文で定義したものです。</p>
<div class="background small-text mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます</p>
</div>
<pre><code class="language-py">def triangle_area(bottom, height):
    return bottom * height / 2</code></pre>
<p>この関数には、<br />
triangle_area という名前があり、<br />
bottom （底辺）と height （高さ）という引数があり、<br />
bottom * height / 2 という計算式があり、<br />
return 文で 計算結果を戻り値として返します。</p>
<p>&nbsp;</p>
<p>同じ機能の関数をラムダ式で作ると、以下のようになります。ラムダ式は、</p>
<pre><code class="language-py">lambda 引数 : 計算式</code></pre>
<p>という構文で記述します。</p>
<pre><code class="language-py">lambda bottom, height : bottom * height / 2</code></pre>
<p>先頭の lambda というキーワードが、ラムダ式をあることを示しています。</p>
<p>引数が複数ある場合は、カンマで区切ります。引数が計算式で使われ、その計算結果が戻り値として返されます（ return 文は、使いません）。</p>
<p>ラムダ式には、<span class="u">関数の名前に相当するものがありません。だから、無名関数</span>なのです。</p>
<h2>ラムダ式の呼び出し方</h2>
<p>名前がある triangle_area 関数は、</p>
<pre><code class="language-py">triangle_area(10, 20)</code></pre>
<p>という構文で呼び出します。</p>
<p>以下は、 Python の対話モードで、 triangle_area 関数を定義して呼び出した例です。説明の都合で、プログラムの行末にコメントを付けていますが、実際にプログラムを動作させるときには、これらのコメントは不要です。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<pre><code class="language-py">>>> def triangle_area(bottom, height):  # def文で関数を定義する
...     return bottom * height / 2
...
>>> triangle_area(10, 20)  # 関数を呼び出す
100.0</code></pre>
<p>それでは、名前がないラムダ式は、どのように呼び出せばよいのでしょう？ いくつかの方法があります。</p>
<p>1 つは、ラムダ式全体をカッコで囲んで、その後にカッコで囲んで引数を指定するという方法です。以下に例を示します。</p>
<pre><code class="language-py">>>> (lambda bottom, height : bottom * height / 2)(10, 20)  # ラムダ式を呼び出す
100.0</code></pre>
<p>もう 1 つは、ラムダ式を変数に代入して、その変数を関数の名前として、通常の関数と同様に呼び出すという方法です。</p>
<p>以下に例を示します。ここでは、ラムダ式に a という名前を付けています。</p>
<pre><code class="language-py">>>> a = lambda bottom, height : bottom * height / 2  # ラムダ式を変数aに代入する
>>> a(10, 20)  # 変数aを関数名として通常の関数と同様に呼び出す
100.0</code></pre>
<h2>ラムダ式の実用的な使い方と高階関数</h2>
<p>先ほど、ラムダ式を呼び出す方法を 2 つ示しましたが、<span class="u">どちらもラムダ式の実用的な使い方ではありません</span>。</p>
<p>Python におけるラムダ式の実用的な使い方は、<span class="bold">高階関数（ higher order function ）の引数にすること</span>です。<span class="u">高階関数とは、引数に関数を指定する関数のこと</span>です。</p>
<p>&nbsp;</p>
<p>Python には、あらかじめ様々な高階関数が用意されています。</p>
<p>たとえば、 Python の組み込み関数（ import 文でインポートせずに、すぐに使える関数）の filter 関数は、</p>
<pre><code class="language-py">filter(関数, イテラブル)</code></pre>
<p>という構文の高階関数です。</p>
<p>filter 関数は、 2 つの目の引数で指定されたイテラブル（リストやタプルなど）から要素を順番に取り出し、それを 1 つ目の引数で指定された関数に渡して True が返されたものだけを抽出します。</p>
<p>&nbsp;</p>
<p>例として、 filter 関数を使って、</p>
<div class="background c-round">
<code class="language-py">[1, 2, 3, 4, 5]</code> というリストから、 3 以上の要素だけを抽出
</div>
<p>してみましょう。</p>
<p>filter 関数の 1 つ目の引数に指定する関数は、引数の値が 3 以上ならTrueを返す、という機能にします。この関数を、 def 文を使って three_or_greater という名前で定義すると、以下のようになります。</p>
<pre><code class="language-py">def three_or_greater(data):
    return data >= 3</code></pre>
<p>filter 関数を、 1 つ目の引数に three_or_greater 関数を指定し、 2 つ目の引数に、 [1, 2, 3, 4, 5] というリストを指定して実行すると、以下のように 3 以上の[3, 4, 5] が抽出されます。</p>
<pre><code class="language-py">>>> def three_or_greater(data):  # def文で関数を定義する
...     return data >= 3
...
>>> list(filter(three_or_greater, [1, 2, 3, 4, 5]))  # 引数に関数を指定する
[3, 4, 5]</code></pre>
<p>filter 関数は、戻り値として filter オブジェクトを返すので、ここでは、それを list 関数でリストに変換しています。リストに変換しないと、要素の値を画面に表示できないからです。</p>
<p>&nbsp;</p>
<p>さて、ここからがポイントです。</p>
<p>filter 関数の 1 つ目の引数に指定しているのは、引数の値が 3 以上なら True を返す、という単純な機能の関数です。 <span class="u">filter 関数を使うために、わざわざ three_or_greater 関数という定義するのは面倒</span>でしょう。</p>
<p>もしも、</p>
<pre><code class="language-py">filter(>= 3, [1, 2, 3, 4, 5])</code></pre>
<p>のように、 filte r関数の引数に <code class="language-py">>= 3</code> という条件が指定できたら便利です。</p>
<p>ただし、 Python の構文では、関数の引数に条件だけを指定することができません。どうしましょう？ そうです！ こういう場面で、ラムダ式が役立つのです。</p>
<p>&nbsp;</p>
<p>filter 関数の引数に、 <code class="language-py">>= 3</code> という条件は指定できませんが、</p>
<pre><code class="language-py">lambda data : data >= 3</code></pre>
<p>というラムダ式なら指定できます。<span class="u">これが、ラムダ式の実用的な使い方</span>です。以下に、例を示します。</p>
<pre><code class="language-py">>>> list(filter(lambda data : data >= 3, [1, 2, 3, 4, 5]))  # 引数にラムダ式を指定する
[3, 4, 5]</code></pre>
<div class="divider mag_h50"></div>
<p>いかがでしたか。 Python のラムダ式の意味と使い方を、しっかりとマスターできたでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/lambda/">基本情報ではじめる Python (6) ラムダ式 って何？ どんな用途で使うの？</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (5) オブジェクト指向</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/oo/</link>
		<pubDate>Wed, 04 Aug 2021 02:58:59 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[オブジェクト指向]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5599</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 Python によるオブジェクト指向の基礎で [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/oo/">基本情報ではじめる Python (5) オブジェクト指向</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 Python による<span class="bold">オブジェクト指向の基礎</span>です。オブジェクト指向は、情報処理推進機構が公開している Python のサンプル問題でも取り上げられている重要なテーマなので、しっかりとマスターしてください。</p>
<style>.left-bordered td:first-child{border:.1em solid black;}.left-bordered tr{border-bottom:unset;}pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}dt{font-weight:700;}.chip{height:auto!important;}@media screen and (max-width:600px){dd{margin-left:1em}}</style>
<h2>オブジェクト指向とは？</h2>
<p>オブジェクト指向は、プログラムの部品化に関する指向です。 Python では、プログラムの部品化に 2 つの指向が使えます。<span class="u">プロセス指向</span>と<span class="u">オブジェクト指向</span>です。</p>
<p>プロセス指向では、<span class="u">関数を部品</span>にします。<br />
オブジェクト指向では、<span class="u">クラスを部品</span>にします。</p>
<p>どちらの指向を使うのかは、プログラマの好みの問題ですが、一般的に言うと、小規模なプログラムには、プロセス指向が適していて、大規模なプログラムには、オブジェクト指向が適しています。</p>
<p>&nbsp;</p>
<p><span class="u">関数は、単独の機能を持った小さな部品</span>です。関数は、外部から引数として渡されたデータを使って処理を行います。<br />
<span class="u">クラスは、複数の機能を持った大きな部品</span>です。クラスは、内部に保持しているデータを使って処理を行います。</p>
<p>たとえば、半径の値から、円周の長さと円の面積を求める部品を作るとしましょう。</p>
<dl class="background c-round">
<dt>プロセス指向</dt>
<dd>外部から引数として渡された半径の値から円周の長さを求める circle_perimeter 関数と、面積を求める circle_area 関数を、別々に作ることになります</dd>
<dt>オブジェクト指向</dt>
<dd>内部に半径の値を保持し、その値を使って円周の長さを求める perimeter メソッド <sup>※</sup> と、円の面積を求める area メソッドを持つ、 Circle クラスを作ることになります</dd>
<dd><sup>※</sup> メソッド（ method = 「やり方」）とは、クラスが持つ処理のこと</dd>
</dl>
<p>以下は、オブジェクト指向の図示技法としてよく使われる UML （ Unified Modeling Language ）のクラス図を使って、 Circle クラスを示したものです。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムや表は横スクロールすると全文をご覧になれます</p>
</div>
<div class="grey lighten-5 pad_20 c-round table-container mag_h30">
<table class="left-bordered">
<tr>
<td>Circle</td>
<td><i class="material-icons blue-text mag_rt05">fast_forward</i>クラス名</td>
</tr>
<tr>
<td>radius</td>
<td><i class="material-icons blue-text mag_rt05">fast_forward</i>クラスが内部に保持するデータ</td>
</tr>
<tr>
<td>perimeter()<br />area()</td>
<td><i class="material-icons blue-text mag_rt05">fast_forward</i>クラスが持つメソッド</td>
</tr>
</table>
</div>
<p>クラス図では、四角形を 3 段階に区切り、上段にクラス名（ここでは Circle ）、中段にクラスが内部に保持するデータ（ここでは radius ）、下段にクラスが持つメソッド（ここでは perimeter() と area() ）を記述します。メソッドは、メソッドあることがわかりやすいように、メソッド名の後に () を付けます。オブジェクト指向では、個々のメソッドではなく、クラス全体が 1 つの部品です。</p>
<h2>クラスを定義する方法</h2>
<p>先ほど UML のクラス図で示した Circle クラスを、 Python のプログラムで表してみましょう。</p>
<p>以下は、 Circle クラスを定義です。このプログラムを Circle.py というファイル名で作成しましょう。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>Python で Circle クラスを定義したプログラム ( Circle.py )</figcaption><pre><code class="language-py"># Circleクラスの定義
class Circle:
    # 初期化メソッドの定義
    def __init__(self, radius):
        self.radius = radius

    # 円周の長さを求めるメソッド
    def perimeter(self):
        return self.radius * 2 * 3.14

    # 円の面積を求めるメソッド
    def area(self):
        return self.radius * self.radius * 3.14</code></pre>
</figure>
<p>クラスは、</p>
<pre><code class="language-py">class クラス名:</code></pre>
<p>という構文で定義します。</p>
<p>クラスのブロックの中に</p>
<pre><code class="language-py">def メソッド名(self, その他の引数, ・・・)</code></pre>
<p>という構文で、メソッドを定義します。</p>
<p>メソッドを定義する構文は、関数を定義する構文と同様ですが、<span class="u">第 1 引数を <code class="language-py"> self </code> にする約束</span>になっています。この self は「自分」という意味であり、そのクラスのインスタンス（インスタンスについてはあとで説明します）の識別情報が自動的に格納されます。それによって、メソッドの処理の中では、</p>
<pre><code class="language-py">self.変数名</code></pre>
<p>という構文で、クラスのインスタンスが持つデータを読み書きできます。このデータを<span class="u">インスタンス変数</span>と呼びます。</p>
<p>perimeter メソッドは、</p>
<pre><code class="language-py">self.radius * 2 * 3.14</code></pre>
<p>という計算で得られる円周の長さを返します。</p>
<p>area メソッドは、</p>
<pre><code class="language-py">self.radius * self.radius * 3.14</code></pre>
<p>という計算で得られる円の面積を返します。</p>
<p><code class="language-py"> self.radius </code> は、「自分が保持しているインスタンス変数 radius 」という意味です。それでは、インスタンス変数 radius の実体は、どこにあるのでしょう？ </p>
<p>それは、 <code class="language-py"> __init__ </code> メソッドの処理内容を見ればわかります。</p>
<h2>特殊メソッド __init__ の役割</h2>
<p>先ほど UML のクラス図で示した Circle クラスには、ありませんでしたが、 Python でクラスを定義するときには、 <code class="language-py"> __init__ </code> メソッドを記述します。 init は、 initialize （初期化）という意味です。</p>
<p>メソッド名の前後に、アンダースコア（ _ ）が 2 つずつあるのは、特定の場面で自動的に呼び出される特殊メソッドであることを意味しています。 <code class="language-py"> __init__ </code> メソッドは、クラスのインスタンスが生成された直後に、自動的に呼び出される特殊メソッドです。</p>
<p><code class="language-py"> __init__ </code> メソッドの処理として、何を行うのかは、プログラムの目的次第ですが、多くの場合に、<span class="u">インスタンス変数を作成</span>します。</p>
<pre><code class="language-py">self.radius = radius</code></pre>
<p>の部分で、インスタンス変数 radius を作成し、それに radius という値を設定しています。</p>
<p>左辺も右辺も radius なので、混乱するかもしれませんが、 self が付いている <code class="language-py"> self.radius </code> がインスタンス変数であり、 self が付いていない radius は外部から引数として <code class="language-py"> __init__ </code> メソッドに渡された半径の値です。 Python は、変数を宣言せずに使う言語なので、この <code class="language-py"> self.radius = radius </code> によって、インスタンス変数 radius が作成されます。</p>
<h2>インスタンスを生成して使う方法</h2>
<p>クラスは、オブジェクトを定義したものです。クラスは、その機能が必要になった時点で、メモリにロードして使います。メモリにロードされたクラスが <span class="bold">オブジェクト</span> であり、クラスの <span class="bold">インスタンス</span>（ instance = 「実例」）とも呼ばれます。</p>
<p>クラスを定義したプログラムは、ハードディスク上にあります。このプログラムをメモリにロードしたものが、クラスのインスタンスです。 1 つのクラスから、複数のインスタンスを生成することもできます。生成とは、メモリにロードすることです。</p>
<p>たとえば、以下の例は、 Circle クラスのインスタンスを 2 つ生成して、それぞれに c1 および c2 という名前を付けたときの、ハードディスクとメモリのイメージです。</p>
<figure><figcaption class="grey-text mag_h10 center">図 Circle クラスのインスタンスを 2 つ生成した例</figcaption><img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/08/figure_class_instance.jpg" loading="lazy"><br />
</figure>
<p>Python のプログラムで、 Circle クラスのインスタンスを生成して使ってみましょう。</p>
<p>以下は、 Circle クラスのインスタンスを 2 つ生成して、それぞれの機能を使うプログラムを、 Python の対話モードで実行したところです。説明の都合で、行末にコメントを付けていますが、実際に実行するときには、コメントは不要です。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 Circle クラスのインスタンスを生成して使う（対話モード）</figcaption><pre><code class="language-bash">>>> from Circle import Circle	# Circleをインポートする
>>> c1 = Circle(10)		# 半径 10 のインスタンス c1 を生成する
>>> c2 = Circle(100)	# 半径 100 のインスタンス c2 を生成する
>>> c1.perimeter()		# c1の円周を求める
62.800000000000004
>>> c2.perimeter()		# c2の円周を求める
628.0
>>> c1.area()			# c1の面積を求める
314.0
>>> c2.area()			# c2の面積を求める
31400.0</code></pre>
</figure>
<p>クラスのインスタンスは、 <code class="language-bash">インスタンス名 = クラス名(引数) </code> という構文で生成します。</p>
<pre><code class="language-bash">c1 = Circle(10)</code></pre>
<p>によって Circle クラスのインスタンス c1 が生成され、引数 radius に 10 という値が渡されて <code class="language-py"> __init__ </code> メソッドが自動的に呼び出されます。</p>
<p>クラスの定義では、メソッドの第 1 引数に self がありますが、<span class="u">メソッドを呼び出すときには、 self を指定しません</span>。 self は、自動的に付加されるようになっているからです。</p>
<p>同様に、</p>
<pre><code class="language-bash">c2 = Circle(100)</code></pre>
<p>によって Circle クラスのインスタンス c2 が生成され、引数 radius に 100 という値が渡されて <code class="language-py"> __init__ </code> メソッドが自動的に呼び出されます。</p>
<p>&nbsp;</p>
<p>それぞれの半径の値を内部に保持したインスタンス c1 と c2 が生成されました。これ以降では、 <code class="language-bash"> インスタンス名.メソッド名() </code> という構文で、メソッドを呼び出して使います。</p>
<p><code class="language-bash"> c1.perimeter() </code> と <code class="language-bash"> c1.area() </code> で、 c1 の円周と面積が求められます。<br />
<code class="language-bash"> c2.perimeter() </code> と <code class="language-bash"> c2.area() </code> で、 c2 の円周と面積が求められます。</p>
<p>perimeter メソッドと area メソッドを呼び出すときに、引数に半径の値を指定していないことに注目してください。これは、どちらのメソッドも、内部に保持している半径の値を使って処理を行っているからです。</p>
<div class="divider mag_h50"></div>
<p>いかがでしたか。 Python によるオブジェクト指向の基礎を、しっかりとマスターできたでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/oo/">基本情報ではじめる Python (5) オブジェクト指向</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (4) if ～ else と while / for</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/control_flow/</link>
		<pubDate>Mon, 05 Jul 2021 02:41:25 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5502</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、 分岐と繰り返しの構文 です。これらは、多くの [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/control_flow/">基本情報ではじめる Python (4) if ～ else と while / for</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、 <span class="bold">分岐と繰り返しの構文</span> です。これらは、多くの場合に、試験問題のプログラム（他人が作ったプログラム）を読み取るときの重要なポイントになるので、しっかりとマスターしてください。</p>
<style>pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}.chip{height:auto!important;}}</style>
<h2>分岐と繰り返しの基本構文</h2>
<p>プログラムの流れには、</p>
<ul class="background c-round">
<li>「順次」</li>
<li>「分岐」</li>
<li>「繰り返し」</li>
</ul>
<p>の 3 つがあります。</p>
<p>順次を表現するのに、特別な構文は必要ありません。複数行の処理を記述すれば、上から下に流れる順次になります。</p>
<p>それに対して、分岐と繰り返しを表現するには、それらを表すための構文を使います。分岐は、 if ～ else 文であり、繰り返しは、 while 文および for 文です。</p>
<p>&nbsp;</p>
<p>図 1 ～図 3 に、それぞれの基本構文を示します。「基本」と断っているのは、<span class="u">これらの構文には、いくつかのバリエーションがある</span>からです。図 3 の for 文の基本構文の中にあるイテラブルとは、要素を取り出せるオブジェクトのことで、リスト、タプル、文字列、辞書、集合、 range 関数などがあります。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムや表は横スクロールすると全文をご覧になれます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 1 if ～ else 文の基本構文</figcaption><pre><code class="language-py">if 条件:
    # 条件が True のときに実行する処理
else:
    # 条件が False のときに実行する処理</code></pre>
</figure>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 2 while 文の基本構文</figcaption><pre><code class="language-py">while 条件:
    # 条件が True である限り繰り返される処理</code></pre>
</figure>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 3 for 文の基本構文</figcaption><pre><code class="language-py">for 変数 in イテラブル
    # イテラブルから取り出した要素を使った処理</code></pre>
</figure>
<p>どの構文でも、ブロックを使っています。ブロックとは、処理のまとまりを示すものです。</p>
<p>Python では、<span class="u">インデント（プログラムの先頭にスペースを入れて字下げすること）でブロックを表します</span>。ブロックには、複数の処理を記述することもできます。たとえば、図 4 は、処理 1, 処理 2, 処理 3 をブロックとした while 文の例です。条件が True である限り、このブロックの中にある 3 つの処理が繰り返されます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 4 ブロックに複数の処理を記述した while 文の例</figcaption><pre><code class="language-py">while 条件：
    # 処理1
    # 処理2
    # 処理3</code></pre>
</figure>
<h2>if ～ else 文による分岐</h2>
<p>それでは、バリエーションも含めて、それぞれの構文を使ったサンプルプログラムを、お見せしましょう。ここでは、 Python の実行モードでプログラムを実行します。たとえば、 sample1.py というファイル名のプログラムは、端末（ Windows ではコマンドプロンプト）で、</p>
<pre><code class="language-bash">python sample1.py</code></pre>
<p>と入力して「 Enter 」キーを押すことで実行します。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class="blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください。 <i class="material-icons">play_arrow</i> ボタンを押すか「 Shift + Enter 」で実行できます</p>
</div>
<p>リスト 1 は、 if ～ else 文の基本構文のサンプルプログラムです。</p>
<p>キー入力した年齢が 20 未満なら「未成年です。」、そうでないなら「成人です。」と表示します。プログラミング言語で使われるキーワードの意味は、英語の意味と同じです。 <span class="u">if は「もしも」という意味で、 else は「そうではないなら」という意味</span>です。</p>
<p><span class="u">英語を日本語に訳すように、プログラムを読んでみましょう</span>。そうすれば、すんなりと意味を読み取れるはずです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 1 if ～ else 文の基本構文のサンプルプログラム ( sample1.py )</figcaption><pre><code class="language-py">age = int(input("年齢->"))
if age < 20:
    print("未成年です。")
else:
    print("成人です。")</code></pre>
</figure>
<p>リスト 1 の実行結果の例を図 5 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 5 リスト 1 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample1.py
年齢->18
未成年です。
C:¥test>python sample1.py
年齢->25
成人です。</code></pre>
</figure>
<h3>if ～ else 文のバリエーション（ if ブロックだけ）</h3>
<p>リスト 2 は、 if ～ else 文のバリエーションです。</p>
<p>if ブロックだけがあり、 else ブロックがありません。このプログラムは、キー入力した年齢が 20 未満なら、「未成年です。」と表示します。そうではないなら、何も表示しません。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 2 if ブロックだけのサンプルプログラム ( sample2.py )</figcaption><pre><code class="language-py">age = int(input("年齢->"))
if age < 20:
    print("未成年です。")</code></pre>
</figure>
<p>リスト 2 の実行結果の例を図 6 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 6 リスト 2 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample2.py
年齢->18
未成年です。
C:¥test>python sample2.py
年齢->25</code></pre>
</figure>
<h3>if ～ else 文のバリエーション（ elif ブロックがある）</h3>
<p>リスト 3 も、 if ～ else 文のバリエーションです。</p>
<p>if ブロックと else ブロックの間に、 <span class="bold">elif</span> ブロックがあります。 <span class="u">elif は、else if の略で「そうではなくて、もしも」という意味</span>です。 if ブロックの条件が True でないなら、 elif ブロックの条件がチェックされます。</p>
<p>このプログラムは、キー入力した年齢が 20 未満なら「未成年です。」、そうではなくて 65 未満なら「成人です。」、そうではないなら「高齢者です。」と表示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 3 elif ブロックがあるサンプルプログラム ( sample3.py )</figcaption><pre><code class="language-py">age = int(input("年齢->"))
if age < 20:
    print("未成年です。")
elif age < 65:
    print("成人です。")
else:
    print("高齢者です。")</code></pre>
</figure>
<p>リスト 3 の実行結果の例を図 7 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 7 リスト 3 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample3.py
年齢->18
未成年です。
C:¥test>python sample3.py
年齢->25
成人です。
C:¥test>python sample3.py
年齢->72
高齢者です。</code></pre>
</figure>
<h2>while 文による繰り返し</h2>
<p>リスト 4 は、 while 文の基本構文のサンプルプログラムです。</p>
<p><span class="u">while は、「～である限り」という意味</span>です。所持金を意味する money の初期値を 10000 として、 money > 0 という条件で、買い物した金額のキー入力と money の更新を繰り返します。</p>
<p>このプログラムの内容は、「所持金がある限り、買い物を繰り返す」というものです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 4 while 文の基本構文のサンプルプログラム ( sample4.py )</figcaption><pre><code class="language-py">money = 10000
while money > 0:
    price = int(input("買い物した金額->"))
    money -= price
print("買い物は終了です。")</code></pre>
</figure>
<p>リスト 4 の実行結果の例を図 8 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 8 リスト 4 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample4.py
買い物した金額->5000
買い物した金額->3000
買い物した金額->2000
買い物は終了です。</code></pre>
</figure>
<h2>for 文による繰り返し</h2>
<p>Python のプログラムでは、イテラブルから要素を繰り返し取り出す、という場面がよくあります。この場合には、 <span class="u">while 文ではなく、 for 文を使います</span>。</p>
<p>リスト 5 は、 for 文の基本構文のサンプルプログラムです。</p>
<pre><code class="language-py">a = [11, 22, 33, 44, 55]</code></pre>
<p>というリスト（リストは、イテラブルの一種です）から要素を繰り返し取り出して、それぞれを画面に表示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 5 for 文の基本構文のサンプルプログラム ( sample5.py )</figcaption><pre><code class="language-py">a = [11, 22, 33, 44, 55]
for x in a:
    print(x)</code></pre>
</figure>
<p>リスト 5 の実行結果の例を図 9 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 9 リスト 5 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample5.py
11
22
33
44
55</code></pre>
</figure>
<h3>range 関数を使った for 文</h3>
<p>擬似言語には、繰り返し回数をカウントする変数を使った</p>
<pre><code class="language-none">■ 変数：初期値, 条件, 増分</code></pre>
<p>という構文があります。たとえば、 </p>
<pre><code class="language-none">■ i：0, i < 10, 1 </code></pre>
<p>なら、変数 i の値を 0 から 10 未満まで 1 つずつ増やしながら繰り返しが行われます。</p>
<p>&nbsp;</p>
<p>これと同様のことを Python で記述すると、リスト 6 のようになります。</p>
<pre><code class="language-py">range(0, 10, 1)</code></pre>
<p>は、 0 から 10 未満まで 1 つずつ増える値を返します。ここでは、その値を変数 i に代入し、画面に表示しています。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 6 range 関数を使った for 文のサンプルプログラム ( sample6.py )</figcaption><pre><code class="language-py">for i in range(0, 10, 1):
    print(i)</code></pre>
</figure>
<p>リスト 6 の実行結果の例を図 10 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 10 リスト 6 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample6.py
0
1
2
3
4
5
6
7
8
9</code></pre>
</figure>
<h2>break 文と continue 文</h2>
<p>繰り返しを行う while 文または for 文のブロックの中で、 <span class="u">break 文を実行すると、繰り返しが中断され、 continue 文を実行すると、それ以降の処理がスキップされます（繰り返しは継続される）</span>。 break は、「中断する」という意味で、 continue は、「継続する」という意味です。</p>
<p>リスト 7 は、 for 文のブロックの中で break 文と continue 文を使ったサンプルプログラムです。 <code class="language-py">range(0, 10, 1)</code> で得た 0 ～ 10 未満の値を変数 i に代入し、画面に表示しています。</p>
<p>その際に、<br />
i の値が 3 のときは、 continue 文が実行されるので、それ以降にある処理がスキップされます（ 3 は表示されません）。<br />
i の値が 7 のときは、 break 文が実行され、その時点で繰り返しが中断します（ 7 以降の値は表示されません）。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 7 break 文と continue 文のサンプルプログラム ( sample7.py )</figcaption><pre><code class="language-py">for i in range(0, 10, 1):
    if i == 3:
        continue
    if i == 7:
        break
    print(i)</code></pre>
</figure>
<p>リスト 7 の実行結果の例を図 11 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 11 リスト 7 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample7.py
0
1
2
4
5
6</code></pre>
</figure>
<h3>while 文と for 文のバリエーション（ else ブロックがある）</h3>
<p><span class="u">繰り返しを行う while 文と for 文のバリエーションとして、どちらにも else ブロックを追加できます</span>。この else ブロックの処理は、 break 文で繰り返しが中断されなかったときに実行されます。</p>
<p>else は、「そうでなければ」という意味なので、この else は、「繰り返しが中断されなかったら」と覚えるとよいでしょう。</p>
<p>リスト 8 は、 for 文に else ブロックを追加したサンプルプログラムです。</p>
<p>繰り返し表示される「中断しますか？」に対して、「 y 」を入力すると繰り返しが中断されるので、 else ブロックの処理が実行されません。最後まで「 y 」を入力しなければ、繰り返しが中断されないので、 else ブロックの処理（「中断されませんでした。」と表示する処理）が実行されます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト 8 for 文に else ブロックを追加したサンプルプログラム ( sample8.py )</figcaption><pre><code class="language-py">for i in range(0, 10, 1):
    print(i)
    s = input("中断しますか？")
    if s == "y":
        break
else:
    print("中断されませんでした。")</code></pre>
</figure>
<p>リスト 8 の実行結果の例を図 12 に示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>図 12 リスト 8 の実行結果の例</figcaption><pre><code class="language-bash">C:¥test>python sample8.py
0
中断しますか？n
1
中断しますか？n
2
中断しますか？n
3
中断しますか？y
C:¥test>python sample8.py
0
中断しますか？n
1
中断しますか？n
2
中断しますか？n
3
中断しますか？n
4
中断しますか？n
5
中断しますか？n
6
中断しますか？n
7
中断しますか？n
8
中断しますか？n
9
中断しますか？n
中断されませんでした。</code></pre>
</figure>
<div class="divider mag_h50"></div>
<p>いかがでしたか。 Python の分岐と繰り返しの構文を、しっかりとマスターできたでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/control_flow/">基本情報ではじめる Python (4) if ～ else と while / for</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (3) 引数 ～ Python の関数の引数には様々な形式がある</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/argument/</link>
		<pubDate>Mon, 07 Jun 2021 05:21:46 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5427</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、関数の引数の形式です。擬似言語の関数の引数には [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/argument/">基本情報ではじめる Python (3) 引数 ～ Python の関数の引数には様々な形式がある</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、関数の引数の形式です。擬似言語の関数の引数には、 1 つの形式しかありませんが、 Python には、様々な形式があります。それぞれの特徴を、しっかりとマスターしてください。</p>
<style>pre{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}.chip{height:auto!important;}}</style>
<h2>擬似言語と同様の「位置引数」</h2>
<p>以下は、引数の位置と設定された値を表示する my_func 関数の定義です。</p>
<p>1 つ目の引数が arg1 で、 2 つ目の引数が arg2 です。この記事では、関数の定義と、それを呼び出すプログラムを、 Python の対話モードで示します。</p>
<p>プログラムの説明としてコメントを付けている部分がありますが、実際にプログラムを動かすときには、コメントを付ける必要はありません。これ以降で示すプログラムでも、関数の名前は my_func であり、処理内容は引数の値を表示するだけです。どれも、様々な形式の引数を知るためのサンプルプログラムです。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>お手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 <a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> 」で、文中のコードをお試しください</p>
<p class=" blue-grey-text hide-on-med-and-up"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムや表は横スクロールすると全文をご覧になれます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>引数の位置と設定された値を表示する my_func 関数の定義</figcaption><pre><code class="language-py">>>> def my_func(arg1, arg2):
...     print(f'1つ目の引数の値 = {arg1}')
...     print(f'2つ目の引数の値 = {arg2}')
...</code></pre>
</figure>
<p>以下は、 my_func 関数を呼び出すプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>位置引数で my_func 関数を呼び出すプログラム</figcaption><pre><code class="language-py">>>> my_func(123, 456)
1つ目の引数の値 = 123
2つ目の引数の値 = 456</code></pre>
</figure>
<p>1 つ目の引数の値に 123 を設定しているので、それが 1 つ目の引数の arg1 に渡されます。<br />
2 つ目の引数の値に 456 を設定しているので、それが 2 つ目の引数の arg2 に渡されます。</p>
<p>このように、関数の定義における引数の位置と、関数を呼び出すときの引数の位置を対応させる形式を「<span class="bold">位置引数</span>」と呼びます。</p>
<p>&nbsp;</p>
<p>擬似言語の関数の引数の形式には、位置引数しかありません。</p>
<p>Python には、位置引数の他にも、</p>
<ul class="background c-round">
<li>キーワード引数</li>
<li>デフォルト引数</li>
<li>可変長引数</li>
<li>可変長キーワード引数</li>
</ul>
<p>という形式があります。これ以降では、それぞれを順番に説明します。</p>
<h2>位置に関係なく引数を設定できる「キーワード引数」</h2>
<p>Python では、関数を呼び出すときに</p>
<pre><code class="language-py">引数名 = 値</code></pre>
<p>と記述することができ、この形式を「<span class="bold">キーワード引数</span>」と呼びます。キーワード引数を使うと、関数の定義における引数の位置とは無関係に、それぞれの引数に値を設定できます。</p>
<p>以下は、引数名と設定された値を表示する関数の定義です。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>引数名と設定された値を表示する my_func 関数の定義</figcaption><pre><code class="language-py">>>> def my_func(arg1, arg2):
...     print(f'arg1の値 = {arg1}')
...     print(f'arg2の値 = {arg2}')
...</code></pre>
</figure>
<p>以下は、 my_func 関数を呼び出すプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>キーワード引数で my_func 関数を呼び出すプログラム</figcaption><pre><code class="language-py">>>> my_func(arg1=123, arg2=456)  # arg1、arg2の順に引数を設定する
arg1の値 = 123
arg2の値 = 456
>>> my_func(arg2=456, arg1=123)  # arg2、arg1の順に引数を設定する
arg1の値 = 123
arg2の値 = 456</code></pre>
</figure>
<p><code class="language-py">my_func(arg1=123, arg2=456)</code>と呼び出しても、 <code class="language-py">my_func(arg2=456, arg1=123)</code>と呼び出しても、 arg1 には 123 が渡され、 arg2 には 456 が渡されます。<span class="u">引数が、位置ではなく引数名で識別されるから</span>です。</p>
<h2>引数の設定を省略できる「デフォルト引数」</h2>
<p>関数の定義で、</p>
<pre><code class="language-py">引数名=デフォルト値</code></pre>
<p>と記述すると、引数が設定されなかったときにデフォルト値が使われます。この形式を「<span class="bold">デフォルト引数</span>」と呼びます。</p>
<p>以下は、 arg1 のデフォルト値を 123 、 arg2 のデフォルト値を 456 とした my_func 関数の定義です。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>デフォルト値を設定した my_func 関数の定義</figcaption><pre><code class="language-py">>>> def my_func(arg1=123, arg2=456):
...     print(f'arg1の値 = {arg1}')
...     print(f'arg2の値 = {arg2}')
...</code></pre>
</figure>
<p>以下は、 my_func 関数を呼び出すプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>デフォルト引数で my_func 関数を呼び出すプログラム</figcaption><pre><code class="language-py">>>> my_func()  # 引数を設定せずに呼び出す
arg1の値 = 123
arg2の値 = 456
>>> my_func(arg1=999)  # arg1だけを設定して呼び出す
arg1の値 = 999
arg2の値 = 456
>>> my_func(arg2=999)  # arg2だけを設定して呼び出す
arg1の値 = 123
arg2の値 = 999</code></pre>
</figure>
<p>引数を設定せずに <code class="language-py">my_func()</code> と呼び出すと、 arg1 がデフォルト値の 123 になり、 arg2 がデフォルト値の 456 になります。<br />
arg1 だけを設定して <code class="language-py">my_func(arg1=999)</code>と呼び出すと、 arg1 は 999 になり、 arg2 がデフォルト値の 456 になります。<br />
arg2 だけを設定して <code class="language-py">my_func(arg2=999)</code>と呼び出すと、 arg1 はデフォルト値の 123 になり、 arg2 が 999 になります。</p>
<h2>任意の数の引数を渡せる「可変長引数」</h2>
<p>関数の定義で、引数に <code class="language-py">*</code>（アスタリスク 1 個）を付けると、任意の数の引数を渡せる「<span class="bold">可変長引数</span>」になります。</p>
<p>可変長引数は、関数を呼び出す側で設定された<span class="u">複数の引数が、 1 つのタプルとして関数に渡される</span>ことで実現されます。</p>
<p>以下は、可変長引数に設定された値を表示する my_func 関数の定義です。 <code class="language-py">*args</code> の部分が、可変長引数です。この args にタプルが渡されるので、 for 文で要素を 1 つずつ取り出して表示しています。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i><a href="https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/try.jupyter.org?urlpath=lab" rel="noopener" target="_blank">JupyterLab</a> をお使いの場合、上のメニューから <i class="material-icons">refresh</i> リスタートして関数を入力ください
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>可変長引数に設定された値を表示する my_func 関数の定義</figcaption><pre><code class="language-py">>>> def my_func(*args):
...     for n in args:
...         print(n)</code></pre>
</figure>
<p>以下は、 my_func 関数を呼び出すプログラムです。</p>
<p>1 個の引数で <code class="language-py">my_func(123)</code> と呼び出すことも、<br />
2 個の引数で <code class="language-py">my_func(123, 456)</code> と呼び出すことも、<br />
3 個の引数で <code class="language-py">my_func(123, 456, 789)</code> と呼び出すこともできます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>可変長引数の my_func 関数を呼び出すプログラム</figcaption><pre><code class="language-py">>>> my_func(123)  # 1個の引数で呼び出す
123
>>> my_func(123, 456)  # 2個の引数で呼び出す
123
456
>>> my_func(123, 456, 789)  # 3個の引数で呼び出す
123
456
789</code></pre>
</figure>
<h2>任意の数のキーワード引数を渡せる「可変長キーワード引数」</h2>
<p>関数の定義で、引数に <code class="language-py">**</code>（アスタリスク 2 個）を付けると、任意の数のキーワード引数を渡せる「<span class="bold">可変長キーワード引数</span>」になります。</p>
<p>可変長引数は、関数を呼び出す側で設定された複数のキーワード引数が、 <span class="u">1 つの辞書として関数に渡される</span>ことで実現されます。<span class="u">キーワード引数の引数名が辞書のキー</span>になり、<span class="u">引数の値が辞書のバリュー</span>になります。</p>
<p>以下は、可変長キーワード引数に設定された引数名と値を表示する my_func 関数の定義です。<code class="language-py">**kwargs</code>の部分が、可変長キーワード引数です。この kwargs に辞書が渡されるので、 for 文で要素を 1 つずつ取り出してキー（引数名）とバリュー（値）表示しています。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>可変長キーワード引数に設定された引数名と値を表示する my_func 関数の定義</figcaption><pre><code class="language-py">>>> def my_func(**kwargs):
...     for k in kwargs.keys():
...         print(f'{k}の値 = {kwargs[k]}')</code></pre>
</figure>
<p>以下は、 my_func 関数を呼び出すプログラムです。</p>
<p>1 個のキーワード引数で <code class="language-py">my_func(arg1=123)</code> と呼び出すことも、<br />
2 個のキーワード引数で <code class="language-py">my_func(arg1=123, arg2=456)</code> と呼び出すことも、<br />
3 個のキーワード引数で <code class="language-py">my_func(arg1=123, arg2=456, arg3=789)</code> と呼び出すこともできます。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>可変長キーワード引数の my_func 関数を呼び出すプログラム</figcaption><pre><code class="language-py">>>> my_func(arg1=123)  # 1個のキーワード引数で呼び出す
arg1の値 = 123
>>> my_func(arg1=123, arg2=456)  # 2個のキーワード引数で呼び出す
arg1の値 = 123
arg2の値 = 456
>>> my_func(arg1=123, arg2=456, arg3=789)  # 3個のキーワード引数で呼び出す
arg1の値 = 123
arg2の値 = 456
arg3の値 = 789</code></pre>
</figure>
<h2>様々な形式の引数を混在させることもできる</h2>
<p>これまでに説明した様々な形式の引数は、 1 つの関数で、混在させて使うこともできます。</p>
<p>たとえば、 Python の組み込み関数である print 関数の引数は、以下の形式になっています。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>print 関数の引数の形式</figcaption><pre><code class="language-py">print(*object, sep=' ', end='\n', file=sys.stdout, flush=False)</code></pre>
</figure>
<p>先頭にある object が可変長引数で、その他の sep, end, file, flush は、デフォルト引数です。可変長引数とデフォルト引数が混在しています。</p>
<ul class="background c-round">
<li>引数 object には、画面に表示するオブジェクトを任意の数だけ設定します</li>
<li>引数 sep には、画面に表示するオブジェクトを区切る文字列を設定します。デフォルト値は、半角スペース 1 個です</li>
<li>引数 end には、すべてのオブジェクトを表示した後の末尾で表示する文字列を設定します。デフォルト値は、改行文字（ <code class="language-py">\n</code> ）です</li>
<li>引数 file には、出力先のファイルを設定します。デフォルト値は、標準出力（ Windows ならコマンドプロンプトの画面）を意味する <code class="language-py">sys.stdout</code> です</li>
<li>引数 flush には、出力をバッファリング（すぐに出力せずに貯めておくこと）するかどうかを <code class="language-py">True</code> または <code class="language-py">False</code> で設定します。デフォルト値は、 False です</li>
</ul>
<p>以下は、 print 関数を呼び出すプログラムです。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>print 関数を呼び出すプログラム</figcaption><pre><code class="language-py">>>> print(123, 456, 789)  # 引数objectだけを設定する
123 456 789
>>> print(123, 456, 789, sep=',', end='')  # 引数sepとendも設定する
123,456,789>>></code></pre>
</figure>
<p>引数 object だけを設定すると、オブジェクト（ここでは、 3 つの整数）が半角スペース 1 個で区切られて、画面に直ちに表示され、最後に改行されます。<br />
引数 sep にカンマ（ <code class="language-py">','</code> ）を設定し、引数 end に空文字列（ <code class="language-py">''</code> ）を設定すると、オブジェクトがカンマで区切られて表示され、最後に改行されません。</p>
<div class="divider mag_h50"></div>
<p>いかがでしたか。 Python の関数の引数に、様々な形式があることがわかったでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/argument/">基本情報ではじめる Python (3) 引数 ～ Python の関数の引数には様々な形式がある</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python (2) 配列 ～ リスト、タプル、文字列、集合、辞書の特徴</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/array/</link>
		<pubDate>Tue, 11 May 2021 03:21:57 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=5337</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 今回のテーマは、要素を持つデータ型（配列）であるリスト、タプル [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/array/">基本情報ではじめる Python (2) 配列 ～ リスト、タプル、文字列、集合、辞書の特徴</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>今回のテーマは、要素を持つデータ型（配列）であるリスト、タプル、文字列、集合、辞書の特徴です。</p>
<p>とても幅広いテーマなので、まずは、この記事で、概要をつかんでください。</p>
<style>th{background:#e0f7fa}pre:not(.ignore-container){border-radius:.5em;}.ignore-container{margin-right: -7.5% !important;margin-left: -7.5% !important;padding-left: 7.5% !important;}table{margin:2em 0 3em}dl.inline dd{margin-left:15em}@media screen and (max-width:600px){dl.inline dd{margin-left:unset;display:inline-block}.chip{height:auto!important;}}</style>
<h2>配列の操作が苦手な人に朗報です！</h2>
<p>基本情報技術者試験の午後試験の「データ構造およびアルゴリズム」には、配列の操作に関する問題がよく出ます。</p>
<p>たとえば、以下は、実際の試験問題に示されたプログラムの一部を抜粋して改変したものです。このプログラムは、要素数 num 個の配列 data を二分割して、前半部の要素を配列 data1 に格納し、後半部の要素を配列 data2 に格納します。</p>
<div class="pad_20 blue-grey-text small-text grey lighten-5 mag_h30 c-round hide-on-med-and-up">
<p class=" blue-grey-text"><i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムや表は横スクロールすると全文をご覧になれます</p>
</div>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>出典：平成 22 年度 春期 午後 問 8</figcaption><pre class="ignore-container"><code class="language-none">/* 配列を二分割する擬似言語のプログラム */
・num1 ← num ÷ 2
・num2 ← num - num1
■ i：0, i &lt; num1, 1
｜・data1[i] ← data[i]
■
■ i：0, i &lt; num2, 1
｜・data2[i] ← data[num1 ＋ i]
■</code></pre>
</figure>
<p>これを見て「そうそう、こういうのが苦手なんです！」という人が多いでしょう。</p>
<p>そんな人に朗報です。 Python の問題には、このように配列をコツコツと操作するプログラムは、ほとんど出ないはずです。なぜなら、 <span class="u">Python の配列は、単なるデータの並びではなく、複数のデータと、データに対する様々な機能をまとめたオブジェクト</span>だからです。</p>
<p>Python の配列を使うと、先ほどの擬似言語と同様の処理を、以下のように短く簡単に記述できます。</p>
<pre class="ignore-container"><code class="language-py"># 配列を二分割するPythonのプログラム
mid = num // 2		# 真ん中の要素の添字を得る
data1 = data[:mid]	# 真ん中より前の要素をdata1に格納する
data2 = data[mid:]	# 真ん中以降の要素をdata2に格納する</code></pre>
<p>擬似言語のプログラムでは、変数 i をループカウンタとして繰り返し処理を行っていましたが、 Python のプログラムには、それがありません。 Python の配列には、指定した位置で要素を切り分ける<span class="bold">「スライス」</span>という機能があるからです（スライスの構文に関しては、後で説明します）。</p>
<div class="background blue-grey-text c-round mag_h30">
<div class="chip z-depth-1 teal white-text">コラム</div>
<p><span class="post-title">配列の要素と添字</span><br />
<code class="language-none">a = ["りんご", "みかん", "ぶどう"]</code> のような配列があった場合、 &#8220;りんご&#8221;, &#8220;みかん&#8221;, &#8220;ぶどう&#8221; のことを要素と言います。<br />
また、後でも詳しく紹介しますが、要素の順序を表す数値を添字と言います。上記の例では、添字 0 の要素は &#8220;りんご&#8221; です。
</div>
<h2>要素を持つデータ型とは？</h2>
<p>先ほど「 Python の配列」と言いましたが、実際には、 Python には、擬似言語の配列と同じものはありません。</p>
<p>擬似言語の配列に相当するオブジェクトとして、</p>
<ul class="background c-round bold">
<li>リスト</li>
<li>タプル</li>
<li>文字列</li>
<li>辞書</li>
<li>集合</li>
</ul>
<p>があり、これらを<br />
「要素を持つデータ型（これは基本情報技術者試験のシラバスに示された呼び名です）」<br />
や<br />
「イテラブル（ iterable = 繰り返し可能）」<br />
と総称します。</p>
<table>
<caption class="grey-text mag_h20">図　要素があるデータ型の種類</caption>
<thead>
<tr>
<th></th>
<th>ミュータブル</th>
<th>イミュータブル</th>
</tr>
</thead>
<tbody>
<tr>
<th>シーケンス</th>
<td>
<ul>
<li>リスト（ list クラス）</li>
</ul>
</td>
<td>
<ul>
<li>タプル（ tuple クラス）</li>
<li>文字列（ str クラス）</li>
</ul>
</td>
</tr>
<tr>
<th>コレクション</th>
<td>
<ul>
<li>辞書（ dict クラス）</li>
<li>集合（ set クラス）</li>
</ul>
</td>
<td></td>
</tr>
</tbody>
</table>
<h3>シーケンスとコレクション</h3>
<p>要素を持つデータ型は、要素に順序がある<span class="bold">「シーケンス」</span>と、順序がない<span class="bold">「コレクション」</span>に分類されます。<span class="u">順序があるとは、個々の要素を添字で指定できる、</span>ということです。</p>
<p>リスト、タプル、文字列は、シーケンスです。<br />
辞書と集合は、コレクションです。</p>
<p>&nbsp;</p>
<p>後で具体例を示しますが、<span class="u">辞書は、添字ではなく、キーで要素を指定</span>します。キーとなる言葉で辞書を引くようなイメージです。<br />
集合は、個々の要素ではなく、データの集まり、つまり集合を取り扱います。</p>
<p>このように、辞書と集合は、「個々の要素を添字で指定できない」というよりは、<span class="bold">「個々の要素を添字で指定するような用途では使わない」</span>のです。</p>
<h3>ミュータブルとイミュータブル</h3>
<p>要素を持つデータ型は、要素の値を変更できる<span class="bold">「ミュータブル」</span>と、変更できない<span class="bold">「イミュータブル」</span>にも分類できます。</p>
<p>リスト、辞書、集合は、ミュータブルです。<br />
文字列とタプルは、イミュータブルです。</p>
<p>ミュータブルとイミュータブルの区別は、あまり気にする必要はありません。なぜなら、<span class="u">試験問題には、イミュータブルな要素の値を変更するような、構文的に間違ったプログラムが出ることはない</span>からです。</p>
<p>&nbsp;</p>
<p>Python のオブジェクトは、クラスとして定義されています。</p>
<p>リスト、タプル、文字列、辞書、集合は、それぞれ list クラス、 tuple クラス、 str クラス、 dict クラス、 set クラスとして定義されています。今回は、取り上げませんが、それぞれのクラスには、様々な機能が用意されています。</p>
<h2>リスト、タプル、文字列の表記方法</h2>
<p>リストは、要素をカンマで区切って並べて、全体を<code class="language-py"> [ </code>と<code class="language-py"> ] </code>で囲みます。<br />
タプルは、要素をカンマで区切って並べて、全体を<code class="language-py"> ( </code>と<code class="language-py"> ) </code>で囲みます。<br />
文字列は、文字の並びの全体を<code class="language-py"> ' </code>と<code class="language-py"> ' </code>または<code class="language-py"> " </code>と<code class="language-py"> " </code>で囲みます。</p>
<p>以下に例を示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>リスト、タプル、文字列の例</figcaption><pre class="ignore-container"><code class="language-py">>>> a = [1, 2, 3, 4, 5]		# リストa
>>> b = (6, 7, 8, 9, 10)	# タプルb
>>> c = "hello"			# 文字列c
</code></pre>
</figure>
<p>左辺の変数に、右辺のリスト、タプル、文字列を代入していますが、これは、<span class="u">代入というよりは、右辺のリスト、タプル、文字列に名前を付けている、</span>と考えてください。</p>
<p>ここでは、 Python の対話モードでプログラムを実行しています。プログラムの後にあるコメントは、説明の都合で付けたものです（これは、これ以降で示すプログラムでも同様です）。</p>
<h2>リスト、タプル、文字列に共通した機能 1（添字による要素の指定）</h2>
<p>シーケンス（順序があり、個々の要素を添字で指定できる）であるリスト、タプル、文字列には、共通した機能がいくつかあります。主な機能を紹介しましょう。</p>
<p>シーケンスの個々の要素は、</p>
<pre class="ignore-container"><code class="language-none"> 名前[添字] </code></pre>
<p>という構文で指定できます。</p>
<p><span class="bold">添字</span>は、先頭から順に 0, 1, 2 ・・・です。マイナスの添字を使うこともでき、この場合には、末尾から順に　-1, -2, -3 です。タプル全体は ( と ) で囲み、文字列全体は &#8216; と &#8216; または &#8221; と &#8221; で囲みますが、どのシーケンスでも、個々の要素は、添字を <code class="language-py"> [</code> と <code class="language-py"> ] </code> で囲みます。</p>
<p>以下に例を示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>要素を添字で指定した例（先ほどのプログラムの続き）</figcaption><pre class="ignore-container"><code class="language-py">>>> a[0]	# リストaの先頭の要素を読み出す
1		# 要素の値は1である
>>> b[0]	# タプルbの先頭の要素を読み出す
6		# 要素の値は6である
>>> c[0]	# 文字列cの先頭の要素を読み出す
'h'		# 先頭の要素は 'h' である
>>> a[-1]	# リストaの末尾の要素を読み出す
5		# 要素の値は5である
>>> b[-1]	# タプルbの末尾の要素を読み出す
10		# 末尾の要素は10である
>>> c[-1]	# 文字列cの末尾の要素を読み出す
'o'		# 末尾の要素は 'o' である</code></pre>
</figure>
<h2>リスト、タプル、文字列に共通した機能 2（スライス）</h2>
<p>シーケンスの要素は、</p>
<pre class="ignore-container"><code class="language-py"> 名前[開始位置:終了位置:ステップ] </code></pre>
<p>という構文で、部分的に切り出せます。この機能を<span class="bold">「スライス（ slice = 断片）」</span>と呼びます。</p>
<p>スライスによって、開始位置～終了位置未満の範囲の要素が、ステップごとに切り出されます。</p>
<p>開始位置を省略すると、先頭の要素から切り出されます。終了位置を省略すると末尾の要素まで切り出されます。ステップを省略すると、 1 個ごとに切り出されます。</p>
<p>以下に例を示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>スライスで要素を部分的に切り出した例（先ほどのプログラムの続き）</figcaption><pre class="ignore-container"><code class="language-py">>>> a[2:4:1]	# リストaのa[2]からa[4]未満の要素を1個ごとに切り出す
[3, 4]		# a[2]からa[3]の要素が切り出される
>>> b[2:4:1]	# タプルbのb[2]からb[4]未満の要素を1個ごとに切り出す
(8, 9)		# b[2]からb[3]の要素が切り出される
>>> c[2:4:1]	# 文字列cのc[2]からc[4]未満の要素を1個ごとに切り出す
'll'</code></pre>
</figure>
<p>スライスは、難しく感じるかもしれませんが、<span class="u">個々の要素を指定する 名前[添字] という構文の拡張バージョン</span>だと思えばわかりやすいでしょう。</p>
<h2>リスト、タプル、文字列に共通した機能 3（ + 演算子と * 演算子）</h2>
<pre class="ignore-container"><code class="language-py"> シーケンス1 + シーケンス2 </code></pre>
<p>という構文で、 2 つのシーケンスを連結できます。</p>
<pre class="ignore-container"><code class="language-py"> シーケンス * 数値 </code></pre>
<p>という構文で、シーケンスを数値の回数だけ繰り返して連結できます。</p>
<p>以下に例を示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>シーケンスで + 演算子と * 演算子を使った例</figcaption><pre class="ignore-container"><code class="language-py">>>> a + a			  # リストaとリストaを + 演算する
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]	  # リストaとリストaが連結される
>>> b + b			  # タプルbとタプルbを + 演算する
(6, 7, 8, 9, 10, 6, 7, 8, 9, 10)  # タプルbとタプルbが連結される
>>> c + c			  # 文字列cと文字列cを + 演算する
'hellohello'			  # 文字列cと文字列cが連結される
>>> a * 3			  # リストaと3を * 演算する
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]  # リストaが3回連結される
>>> b * 3			  # タプルbと3を * 演算する
(6, 7, 8, 9, 10, 6, 7, 8, 9, 10, 6, 7, 8, 9, 10)  # タプルbが3回連結される
>>> c * 3			  # 文字列cと3を * 演算する
'hellohellohello'		  # 文字列cが3回連結される</code></pre>
</figure>
<h2>辞書の表記方法と機能（キーによる要素の指定）</h2>
<p>辞書は、</p>
<pre class="ignore-container"><code class="language-py">キー:バリュー</code></pre>
<p>という形式の要素をカンマで区切って並べて、全体を <code class="language-py"> { </code> と <code class="language-py"> } </code> で囲みます。</p>
<p>以下は、英語をキー（鍵 key ）、それに対応した日本語をバリュー（値 value ）とした辞書の例です。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>英語と日本語を対応付けた辞書の例</figcaption><pre class="ignore-container"><code class="language-py">>>> d = {"apple":"リンゴ", "orange":"ミカン", "grape":"ブドウ"}  # 辞書d</code></pre>
</figure>
<p>辞書には、辞書ならではの機能があります。</p>
<p>それは、シーケンスの個々の要素を</p>
<pre class="ignore-container"><code class="language-py"> 名前[キー] </code></pre>
<p>という構文で指定することです。 [ と ] の中にあるのが、<span class="u">添字ではなくキーであることに注目</span>してください。このキーの指定によって、対応するバリューが得られます。</p>
<p>以下に例を示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>要素をキーで指定した例（先ほどのプログラムの続き）</figcaption><pre class="ignore-container"><code class="language-py">>>> d["apple"]		# "apple" というキーに対応するバリューを得る
'リンゴ'		# "リンゴ" である
>>> d["orange"]		# "orange" というキーに対応するバリューを得る
'ミカン'		# "ミカン" である
>>> d["grape"]		# "grape" というキーに対応するバリューを得る
'ブドウ'		# "ブドウ" である</code></pre>
</figure>
<h2>集合の表記方法と機能（集合演算）</h2>
<p>集合は、要素をカンマで区切って並べて、全体を <code class="language-py"> { </code> と <code class="language-py"> } </code> で囲みます。{ と } で囲むことは、辞書と同じですが、<span class="u">要素がキー:バリュー という形式ではない</span>ので、集合と辞書を区別できます。</p>
<p>以下は、集合の例です。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>集合の例</figcaption><pre class="ignore-container"><code class="language-py">>>> e = {1, 2, 3, 4}	# 集合e
>>> f = {3, 4, 5, 6}	# 集合f</code></pre>
</figure>
<p>集合には、集合ならではの機能があります。それは、集合どうしで<span class="bold">「交わり（積集合）」</span>や<span class="bold">「結び（和集合）」</span>などの集合演算ができることです。</p>
<p>交わりは、&#038; 演算子で求められ、結びは | 演算子で求められます。集合どうしの演算結果は、集合になります。このように、個々の要素ではなく、要素の集まりを取り扱うから、集合なのです。</p>
<p>以下に例を示します。</p>
<figure><figcaption class="chip"><i class="material-icons indigo-text mag_rt05">code</i>集合どうして演算を行った例（先ほどのプログラムの続き）</figcaption><pre class="ignore-container"><code class="language-py">>>> e & f		# 集合eと集合fの交わりを求める
{3, 4}			# {3, 4} という集合が得られる
>>> e | f		# 集合eと集合fの結びを求める
{1, 2, 3, 4, 5, 6}	# {1, 2, 3, 4, 5, 6} という集合が得られる</code></pre>
</figure>
<h2>要素があるデータ型の使い分け</h2>
<p>要素があるデータ型が5種類もあるので、どのように使い分けたらよいか、混乱してしまうかもしれません。</p>
<p><span class="bold">「基本的にリストを使い、その他は、それぞれの独自の機能が活かせる場面で使う」</span>と考えてください。</p>
<p>シーケンスで（順序があり、個々の要素を添字で指定できる）、ミュータブルである（要素の値を書き換えられる）リストは、擬似言語の配列に近いものです。したがって、特に理由がないなら、リストを使えばよいのです。</p>
<p>要素の値を変更することがないなら、イミュータブルの（要素の値を書き換えられない）タプルを使うとよいでしょう。<br />
文字の並びを取り扱う場合は、当然ですが、文字列を使います。<br />
添字ではなく、キーで要素を指定するなら、辞書を使います。<br />
個々の要素ではなく、全体をまとめて取り扱うなら、集合を使います。</p>
<p class="center grey-text mag_tp15 mag_bt05">要素があるデータ型の使い分け</p>
<dl class="background c-round inline">
<dt>・特に理由がない</dt>
<dd><i class="material-icons">arrow_forward</i>　リストを使う</dd>
<dt>・要素の値を変更しない</dt>
<dd><i class="material-icons">arrow_forward</i>　タプルを使う</dd>
<dt>・文字の並びを取り扱う</dt>
<dd><i class="material-icons">arrow_forward</i>　文字列を使う</dd>
<dt>・キーで要素を指定する</dt>
<dd><i class="material-icons">arrow_forward</i>　辞書を使う</dd>
<dt>・要素をまとめて取り扱う</dt>
<dd><i class="material-icons">arrow_forward</i>　集合を使う</dd>
</dl>
<div class="divider mag_h50"></div>
<p>いかがでしたか。要素を持つデータ型の種類と特徴がわかったでしょう。</p>
<p>この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。</p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/array/">基本情報ではじめる Python (2) 配列 ～ リスト、タプル、文字列、集合、辞書の特徴</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
