質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python

    7942questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6350questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Atom (テキストエディタ)

    508questions

python3 abs関数もどき作りました。どうでしょうか?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 209

sasuke_killer

score 30

 abs関数もどきを作りました。

Python3
abs関数と言えば皆さんご存知、絶対数を返す関数です。
初心者の僕でも作れそうな関数だと思ったので作ってみました。
下にコードを載せます。改善点等ありましたらご回答ください!

def abs_made(kazu)
    if kazu<0:
        X=kazu*-1
    else:
        X=kazu
    return X

print(abs_made(-3))

あ、kazuが数字じゃなかったらエラーメッセージを出す、みたいなコードが書けるのであればヒントを教えていただきたいです。

追記
「こんな書き方もあるよ」って人も回答頂けると有難いです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

関数を定義するだけならラムダ式でもいいかもしれませんね。

abs_made = lambda x : x if x > 0 else -x

補足

Pythonのabsは絶対値を計算するまえに対象のオブジェクトが持っている__abs__メソッドがあるかを確認しに行きます。numpyの行列を考えるとこのままじゃまずいですし。

import numpy as np
mat = np.array([-1, 1])
print(abs(mat))  # ok
print(mat.__abs__())  # abs(mat)は実際にはこう動く
print(abs_made(mat))  # fail




__abs__の話はクラスを知らないと難しいので、興味がない限りスルーしてください。と断った上で続けます。

__abs__は主にbuilt-in関数のabsによって呼び出される(オブジェクト固有の)メソッドです。numpy.ndarrayという行列の型の場合だと、np.absoluteと同じです。
[https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.absolute.html]
(https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.absolute.html)

疑似コードだとこういう順序です。

def myabs(x):
    try:
        # 
        print("試しにx.__abs__()を呼んでみます")
        return x.__abs__()  
    except AttributeError:
        # Xが__abs__を実装していない場合
        print("x.__abs__()なんてありませんでしたorz")
        return x if x > 0 else -x

自前でx__abs__を実装したクラスの例は次の通りです。

class MyClass:
    def  __init__(self, x):
        self.x = x
    def __abs__(self):
        # absに呼び出してもらうための関数
        # 試しに違う絶対値を実装してみる
        print("    MyClassの__abs__だよ")
        return (self.x ** 2) ** (1/2)

A = MyClass(-2)
print(myabs(A))  # 自作のabs
print(abs(A))  # Python のbuilt-inのabs

こんな仕組みが用意されている理由の一つとして考えられ得るのは、数学の絶対値absにいろんな定義があるためです。一例を上げると、質問の中にある絶対値の定義は複素数の絶対値の定義と異なります。そうすると、実数なら・・・複素数なら・・・と様々な定義をabs関数に埋め込まないと行けなくなってしまい、とても複雑な関数になってしまいかねません。それを避けるための仕組みなのですが、逆に自分でクラスを作らない限りはこの仕組を意識することはないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 16:27

    PEP8違反をしてまでラムダ式を使うメリットも無いような...

    キャンセル

  • 2018/07/28 16:35

    _abs_メソッドとはどのようなものなのでしょうか…?

    キャンセル

checkベストアンサー

+1

私が書くならこんなかんじですかね。

def my_abs(arg):
    if arg < 0:
        return -arg

    return arg

あるいは条件演算子を使います。

def my_abs(arg):
    return -arg if arg < 0 else arg

ネタ。真似しちゃダメです。

def my_abs(arg):
    return [
        lambda a:  a,
        lambda a: -a
    ][arg < 0](arg)

kazuが数字じゃなかったらエラーメッセージを出す

型を調べて例外を投げれば良いです。
が、Pythonの性格にあまりそぐわないような気もします。

型ヒントを付けておけば、静的解析で警告を出すことは可能です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 15:04

    なるほど…Xに代入するだけ無駄でしたねw
    ありがとうございます!

    キャンセル

  • 2018/07/28 15:07

    returnを末尾にまとめた方が見やすいという意見もあるので、一概にXが無駄と言えるわけではないです。
    個人的には精神的スタックが減るぶん、早々にreturnする方法が好みですが。

    キャンセル

  • 2018/07/28 15:08

    ん?argが0より小さかったら、-argとargの2つの数が表示される気がするのですが…

    キャンセル

  • 2018/07/28 15:14

    returnされたら関数内のそれ以降の文は実行されないです。
    もちろんelseを用いても意味的には同じです。これも好みに依ります。

    キャンセル

  • 2018/07/28 15:16

    そうなんですね!
    ありがとうございました!

    キャンセル

+1

"python abs impliments" で gooogle 検索してみるとよいです。

上の一番目のページを参考にこんなコードをかいてみました。
xxx.rb
```ruby import math

def simple_abs(num):     return -num if num < 0 else num

def my_abs(num):     return -num if math.copysign(1, num) < 0 else num

x = -0.0 print("abs:", abs(x)) print("simple_abs:", simple_abs(x)) print("my_abs:" , my_abs(x))

``
実行結果
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 17:04

    copysignを使うなら return math.copysign(1, num) * num で充分では。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7942questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6350questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Atom (テキストエディタ)

    508questions