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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

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

Q&A

解決済

3回答

331閲覧

type関数について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/10/09 06:47

プログラミング初学者です

https://www.hackerrank.com/challenges/string-validators/problem

リンク先のこの練習問題を解き、discussionを見ていると

python

1s = input() 2t = type(s) 3for method in [t.isalnum, t.isalpha, t.isdigit, t.islower, t.isupper]: 4 print(any(method(c) for c in s)) 5

このような解き方があることがわかりました

何のためにtype関数が用いられているのでしょうか
また、t を str に代えても動くようですが、何のために使われているのかが理解できませんでした
説明いただけるとありがたいです
よろしくお願いします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

typeを使う意味はないと思います。

その人がわざわざtypeを使ったのは、そのdiscussionにてharishbishtさんが

lang

1str = raw_input() 2print any(c.isalnum() for c in str) 3print any(c.isalpha() for c in str) 4print any(c.isdigit() for c in str) 5print any(c.islower() for c in str) 6print any(c.isupper() for c in str)

と書いており、これではstrが上書きされているのでstrクラスがstrという名前で使えないために、この人のコードに気を使ってtype(s)を使った例を書いたのだと思います。

投稿2017/10/09 07:39

karamarimo

総合スコア2551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/09 07:46

[s.isalnum, s.isalpha, s.isdigit, s.islower, s.isupper]: type()を使わずにこう変えると動かないのはなぜでしょうか データの型を得た意味は何でしょうか
karamarimo

2017/10/09 08:09 編集

まず、isalnum, isalpha, ... はすべて str の instance method です。 s は str の instance であり例えば s.isdigit は引数が0個なので、forループで method(c) が実行されるとエラーが発生します。 一方 str.isalnum だとなぜうまく行くかというと、instance method は instance を第一引数にとるからです。例えばこういうクラスがあったとき、 class C(object): def __init__(self): self.x = 1 def method1(self): return self.x instance c1 を作ります。 c1 = C() このとき c1.method1() は C.method1(c1) と同じ動作をします。 今の場合、 "2".isalnum() と str.isalnum("2") は同じなわけです。
退会済みユーザー

退会済みユーザー

2017/10/09 08:37

疑問点に対する回答になりそうなので、まずはこれを理解します 丁寧な回答ありがとうございます
guest

0

何かの理由があってtype関数を用いているのかも、と考えることはもちろん無駄ではありませんが、正直気にしてもしょうがない話だと思います。


python

1s = input() 2t = str 3for method in [t.isalnum, t.isalpha, t.isdigit, t.islower, t.isupper]: 4 print(any(method(c) for c in s))

と書いたって一緒ですが、このstrがどこからでてきたのかというと「input()の返り値がstr型である」からです。
このコードを読む人に対して「input()の返り値がstr型であるという知識がある」ことを要求します。
もしくは、「input()の返り値はstr型なんだろうな/str型でなければならないんだろうなという推測」を要求します。


python

1s = input() 2t = type(s) 3for method in [t.isalnum, t.isalpha, t.isdigit, t.islower, t.isupper]: 4 print(any(method(c) for c in s))

だと、「input()の返り値はなんであれ、isalnumisalphaisdigitislowerisupperのメソッドを持つことを要求しているんだなという推測」を要求します。

その程度の違いです。inputぐらいメジャーなライブラリ関数に関する限り、たいして違いはありません。


(追記)

[s.isalnum, s.isalpha, s.isdigit, s.islower, s.isupper]:

呼び出し方が変わるからです。そう聞いたということはTypeError: isalnum() takes no arguments (1 given)のエラーが出ることは確認してますよね? そのエラーメッセージの通りです。

pyhton

1"abc".isalnum()

と等価な呼び出しは

pyhton

1str.isalnum("abc")

です。これを理解しないといけません。str.isalnumは一つの引数を取りますが、"abc".isalnumは引数を取りません。

[s.isalnum, s.isalpha, s.isdigit, s.islower, s.isupper]:にしたら、この各要素は引数を取らないのです。

python

1for method in [s.isalnum, s.isalpha, s.isdigit, s.islower, s.isupper]: 2 print(any(method() for c in s))

と変えるととりあえずエラーなく動きます。が、やりたいこととは違う処理になります。
データの型を得た意味は何でしょうかという質問が、なぜこう書いたら駄目なのか、という意味なら、処理が変わるから、でしょう。

投稿2017/10/09 08:21

編集2017/10/09 10:07
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/09 08:33

下記で追加でコメントしているのですが、 [s.isalnum, s.isalpha, s.isdigit, s.islower, s.isupper]: type()を使わずにこう変えると動かないのはなぜでしょうか データの型を得た意味は何でしょうか 疑問点はこれになります
quickquip

2017/10/09 09:45

「type()を使わずにこう変えると動かないのはなぜでしょうか」と「データの型を得た意味は何でしょうか」は別の質問として書いてますか? おなじ質問の別の言い方と捉えていいですか?
guest

0

そのdiscussionのページによると、このコードもあります。

python

1for method in [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]: 2 print any(method(c) for c in s)

つまり、この関数のリストをループして、関数が一つ一つ実行される。

isalnumとかisalphaはstrのメソッドです。
そのために、str.が使われています。

strが無くて、そのメソッドは存在しないので、isalnumだけを使いますと、「NameError: name 'isalnum' is not defined」と出てきてしまいます。

質問にあるtype関数は、str型のsの引数を取って、<class 'str'>を返ります。

投稿2017/10/09 07:24

golgi

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/10/09 07:38

なぜわざわざtype関数を介する必要があるのか、というのが質問の主旨かと思います。
golgi

2017/10/09 08:07 編集

なるほど~、ぼくはlucky_manさんの質問の意味を少し勘違いしていました(笑)ごめん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問