重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

プログラミングの小テストで、先生から 「来週の小テスト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件)

エクセルとゴッチャになってんじゃないの?

    • good
    • 0

久々に面白い質問だ(笑)。



まず用語を整理しておこう。
モダンなプログラミング言語に於いて、「ある計算のまとまり」の定義を「関数」と呼ぶ。
関数はユーザーレベルで拡張が可能だ。ビルトイン関数を利用して新しい関数を書く、なんつーのは良くやってるだろう。
一方、「ユーザーが拡張不可能」な機能を「構文」と呼ぶ。これはユーザーが「こんな機能があったらなぁ」とか思っても、一般的には「書けない」。書くことを許されていない。
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関数、って言ったのなら大した先生だ。「構文とは何ぞや」を把握させるにはいい質問だと思う。
じゃなけりゃ他の人が言ってる通り、あんまりプログラミングそのもの、とかプログラミング言語に詳しくないんだろう。

以上。
    • good
    • 0

まずは、もっと具体的に「if関数が分かりません」について補足してください。



○ pythonに「if関数」なんて「関数」はありません。
「『if文』なら知ってるけど『if関数』はわからない」ということなら、存在しない「if関数」のことがわからないのは当り前です。
「if文」の聞き間違いかなんかでしょう。

○ 「if文」なら基本中の基本なので、教科書に載ってるはずです。
勉強しましょう。

○それでもわからないのなら、具体的にわからないところを補足してください。
・教科書に「◆◆」と書いてあるけど、この◆◆がわからない
・「○○しろ」という問題なので、□□すればよい、と考えて、△△というプログラムを書いたが、実際には××という動作をする。なぜだかわかならない。

これらの○○や××等を全て埋めてください。

これは、自分で勉強したり修正したりするときにも重要です。
・○○しろ、に対して□□すればよい、というのが間違い。以降が無意味。
・△△というプログラムが、□□と違う内容になってしまっている。
・××から逆に辿っていく。××にはエラーも含まれる。
    • good
    • 1

講義で履修してない部分をテストすることは考えられないけど・・・・



『if関数が分かりません。』
てのは、習ってないからわからない?
履修済みだけどよく理解できてない?
どういう意味ですかね・・・・

履修してるなら復習しようよ
https://www.kikagaku.co.jp/kikagaku-blog/python- …
    • good
    • 0

pythonにif関数なんてないと思うけど。

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A