
プログラミングの小テストで、先生から 「来週の小テスト3では,今回の小テスト2で使用した内容(f文字列,random関数,input関数,リスト)に加えて,if関数を使いますので,そこら辺を要復習のこと.」と連絡があったのですが、if関数が分かりません。次回のテストで訳あって、満点をとりたいのでif関数について簡単に教えて欲しいです。それかおすすめの解説サイトなどを教えて欲しいです。
ちなみに前回のテストはこんな感じでした。
https://trinket.io/python3/0a387c5eedba
上記のURLをクリックし、続きのPython3のコーディングをしましょう.
IIII
問題:まずは、あなたの名前をinput()関数を使って登録し、「ハロー、名前!」と表示させるコードを書きまし
よう.
次に,random.choice()関数とリストを利用して、1~
6の値の内。どれか一つがランダムに表示されるコードを書きましょう.
最後に,f文字列を使用し「1名前さんのサイコロの目は数字}です。」と表示させるコードを書きましょう。
===
import random #←これはrandom関数を使うために必要なので消さないで.
# Begin coding from hereafter.
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
久々に面白い質問だ(笑)。
まず用語を整理しておこう。
モダンなプログラミング言語に於いて、「ある計算のまとまり」の定義を「関数」と呼ぶ。
関数はユーザーレベルで拡張が可能だ。ビルトイン関数を利用して新しい関数を書く、なんつーのは良くやってるだろう。
一方、「ユーザーが拡張不可能」な機能を「構文」と呼ぶ。これはユーザーが「こんな機能があったらなぁ」とか思っても、一般的には「書けない」。書くことを許されていない。
ifなんかの条件分岐文、あるいはPythonで言うトコの条件式は「ユーザーが書けない」あるいは「ユーザーレベルでは拡張が不可能」なんだ。このテの「構文」には、Pythonのforやwhile、リスト内包表記等がある。
理論的な話をすると、Pythonにif関数なんつーものはビルトインでは存在しないが、別に作る事自体は構わんだろう。
ただし、ちょっとした制限(いや、実はこれが大きいんだけど)がある。
ある種有名な問題なんだけど、ちと説明しようか。
例えばPythonでこういう関数を書くとする。
def new_if(predicate, then_clause, else_clause):
return then_clause if predicate else else_clause
これが「if関数」だ。実際使ってみればある程度は「上手く動く」事が分かるだろう。
>>> new_if(2 == 3, 0, 5)
5
>>> new_if(1 == 1, 0, 5)
0
ところが、例えば「if関数」を使って次のようなコードを書いてみる。
def div42():
denominator = int(input("42をいくつで割りますか?"))
return new_if(denominator == 0, "0による除算", 42/denominator)
42を入力値で割る関数だが、当然、「数値は0では割れない」。よって、「if関数」で条件分岐して制御しようとするが・・・・・・。
>>> div42()
42をいくつで割りますか?7
6.0
フツーに0以外を入力すればマトモに動くが一方、狙って0を入力すると、だ。
>>> div42()
42をいくつで割りますか?0
Traceback (most recent call last):
File "/usr/lib/python3.12/idlelib/run.py", line 580, in runcode
exec(code, self.locals)
File "<pyshell#15>", line 1, in <module>
File "/home/sun/test.py", line 6, in div42
return new_if(denominator == 0, "0による除算", 42/denominator)
~~^~~~~~~~~~~~
ZeroDivisionError: division by zero
「0による除算」を避けた筈なのに、思いっきり引っかかって「ZeroDivisionError」を食らう事になる。
果てさて、どうしてだ、と。
Pythonを含み、フツーのプログラミング言語の「関数」は、関数での計算に入る前に先に引数を評価する。
これを「先行評価」と呼ぶ。
上のように「0の入力を制御した」つもりなのに、ZeroDivisionErrorを食らう原因は、まさしく「if関数」が最初に引数を評価するから、なんだ。つまり、どう制御を書こうとしても、計算に入る前に最初に42/denominatorが評価されてしまう。
結果、denominatorが0だった場合、問答無用でZeroDivisionErrorが起こり、「if関数」の本体が実行される前に例外が投げられるわけだ。
一方、例えばここでは条件式を使うが、Python組み込みのif〜elseを使えば問題は生じない。
def div42():
denominator = int(input("42をいくつで割りますか?"))
return "0による除算" if denominator == 0 else 42/denominator
42をいくつで割りますか?7
6.0
>>> div42()
42をいくつで割りますか?0
'0による除算'
つまり、if式及びif文では「片方が評価されたら」もう一方は「無評価」になる。要は「関数の評価規則と全く違う」わけだ。
if 関数 -> 引数が最初に全部評価される
if 式/文(Python組み込み) -> 節は条件部分によって評価されたりされなかったりする
それが一般に、if等の条件文/式が「構文である」理由だ。関数の評価規則に従ってないんだ。
もうちょっと突っ込んでみよう。仮に引数の評価を任意に遅らせる事が出来るような関数が書けたら問題は生じない、って事になる。
def new_if(predicate, then_clause, else_clause):
return then_clause() if predicate else else_clause()
今度はthen節、及びelse節で受け取る引数は「関数である」と仮定する。
これを利用して先程のdiv42を書き換えてみよう。
def div42():
denominator = int(input("42をいくつで割りますか?"))
return new_if(denominator == 0, lambda: "0による除算", lambda: 42/denominator)
then節とelse節を無引数ラムダ式で包む。これを「サンクを作る」と表現する。
新しく作った「if関数」のthen節とelse節に与えるブツが「サンク」である、と言うルールだとすれば、div42は問題なく動くわけだ。
>>> div42()
42をいくつで割りますか?7
6.0
>>> div42()
42をいくつで割りますか?0
'0による除算'
これなら「if関数」はマトモに動く。しかし一々then節とelse節を無引数ラムダ式で包むのもどうだろう、ってならないだろうか。
かなり面倒くさいだろう。
結論は、Pythonのような先行評価な言語でも、関数がファーストクラスオブジェクトな言語なら、記述が面倒臭くても「if関数」はあり得る。
ただし、世の中には理論上「構文と関数に差がない」プログラミング言語もある。それは、Pythonやフツーのプログラミング言語のように「先行評価」ではない。それら「if関数」がフツーに成り立つプログラミング言語の評価規則を「遅延評価」と呼ぶ。
遅延評価を採用してる言語だと、引数の評価が「必要になった時に」行われるので、if関数みたいなのを書いてもPythonみたいにならないんだ。
とまぁ、貴方の先生が「そこまで考えて」if関数、って言ったのなら大した先生だ。「構文とは何ぞや」を把握させるにはいい質問だと思う。
じゃなけりゃ他の人が言ってる通り、あんまりプログラミングそのもの、とかプログラミング言語に詳しくないんだろう。
以上。
No.3
- 回答日時:
まずは、もっと具体的に「if関数が分かりません」について補足してください。
○ pythonに「if関数」なんて「関数」はありません。
「『if文』なら知ってるけど『if関数』はわからない」ということなら、存在しない「if関数」のことがわからないのは当り前です。
「if文」の聞き間違いかなんかでしょう。
○ 「if文」なら基本中の基本なので、教科書に載ってるはずです。
勉強しましょう。
○それでもわからないのなら、具体的にわからないところを補足してください。
・教科書に「◆◆」と書いてあるけど、この◆◆がわからない
・「○○しろ」という問題なので、□□すればよい、と考えて、△△というプログラムを書いたが、実際には××という動作をする。なぜだかわかならない。
これらの○○や××等を全て埋めてください。
これは、自分で勉強したり修正したりするときにも重要です。
・○○しろ、に対して□□すればよい、というのが間違い。以降が無意味。
・△△というプログラムが、□□と違う内容になってしまっている。
・××から逆に辿っていく。××にはエラーも含まれる。
No.2
- 回答日時:
講義で履修してない部分をテストすることは考えられないけど・・・・
『if関数が分かりません。』
てのは、習ってないからわからない?
履修済みだけどよく理解できてない?
どういう意味ですかね・・・・
履修してるなら復習しようよ
https://www.kikagaku.co.jp/kikagaku-blog/python- …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プログラミングについて
その他(プログラミング・Web制作)
-
今のプログラミング言語
その他(プログラミング・Web制作)
-
プログラマー達は何故、プログラムを入れるフォルダーに容量制限があるのを知らない?
C言語・C++・C#
-
-
4
pythonでのローカルファイルからの読み込みが出来ない
その他(プログラミング・Web制作)
-
5
DLLファイルの逆コンパイラについて詳しい方
C言語・C++・C#
-
6
著作権法について
その他(プログラミング・Web制作)
-
7
プログラム言語
その他(プログラミング・Web制作)
-
8
プログラミングに興味があるのですが、作りたいものはありません。 ゲーム機とかパソコンの中身(ソースコ
その他(プログラミング・Web制作)
-
9
10進数から2進数に変換 例 185 185÷2=92.5 小数点以下切り捨て 91と勘違いしてしま
その他(プログラミング・Web制作)
-
10
数学、プログラミング、物理、化学など理系の方に質問 プログラミング言語、数式、化学式などで会話をしよ
その他(プログラミング・Web制作)
-
11
QRコードの作成方法について
オープンソース
-
12
老いたので暇つぶしに勉強を考えていますがJavaScriptは現行ですよね、
JavaScript
-
13
Windows用アプリ作成方法
その他(コンピューター・テクノロジー)
-
14
C言語 関数、変数の宣言について
C言語・C++・C#
-
15
趣味がプログラミングだと言ってもいい?
その他(プログラミング・Web制作)
-
16
AIがプログラムする時代のプログラマー不要論の相違について
その他(プログラミング・Web制作)
-
17
義務教育は廃止すべき
教育学
-
18
pythonについて(初心者です)
その他(プログラミング・Web制作)
-
19
パイソンのソースコードをChatGPTで書いてもらうのを独学でやろうと思うとどういう方法がオススメで
その他(プログラミング・Web制作)
-
20
絶対パスと相対パスについて。
HTML・CSS
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大学の持ち込み可テストの持ち...
-
if関数とは?
-
日本人のIQとEQの平均を教えて...
-
テストと検証の違いってなに?
-
短大のテストって60点以下がだ...
-
苦しまずに死ぬ方法はなんですか。
-
長文失礼します。中学2年女子で...
-
条件反射について
-
出ちゃうと日本の大学って脳み...
-
本免の筆記は教習所からもらっ...
-
元々知能が低い人間はどんなに...
-
一に勉強、二に勉強
-
活用形の見分け方がわかりませ...
-
高校までの教科書を閲覧する方法
-
塾に行く時に手の爪にマニキュ...
-
クラTに入れる背ネーム悩んでま...
-
皆さんは自分より詳しい同じ趣...
-
学校の自習室で社会や英単語な...
-
カフェでコーヒー一杯注文して6...
-
百人一首の暗記の意義
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大学の持ち込み可テストの持ち...
-
if関数とは?
-
テストと検証の違いってなに?
-
大学の単位取得について
-
高校1年生です。 数学で、赤点...
-
短大のテストって60点以下がだ...
-
レディネステストとプレテスト
-
共通テストについて
-
4月から看護専門学生になりま...
-
IQ114では、普通でしょうか。
-
秀英予備校統一テストについて
-
日本人のIQとEQの平均を教えて...
-
100点満点のテストでクラス30人...
-
中学三年生です。音楽の成績が...
-
大学の単位について
-
初めての中間テスト
-
息子は中1です 何に対してもや...
-
松本人志って知的障害あるんで...
-
苦しまずに死ぬ方法はなんですか。
-
条件反射について
おすすめ情報