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

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

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

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

Q&A

解決済

4回答

536閲覧

[python3]print()の書き方でこれはあっているのでしょうか。また、専門用語としては何というのでしょうか。

nomio

総合スコア1

Python

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

1グッド

1クリップ

投稿2020/06/10 16:15

発生している問題

AtCoderのABC過去問を解いたあと、必ず他の人のコードを見て表現の仕方などを参考にしています。
ある方のコードがシンプルでいいなと思ったのですが、理解ができませんでした。
自分なりに調べたのですが、該当する内容がでてきませんでした。
どなたか解説していただけないでしょうか。

該当のソースコード

k=int(input())
s=input()
print(s[:k] + (len(s)>k)*'...')

kは整数、sは文字列。
文字列の文字数がkよりも大きい場合、sをk文字まで表示し、末尾に”…”を追加するという問題です。
print()内の(len(s)>k)*'...'という書き方がわかりません。
Trueの場合に”…”をs[:k]の後に追加するという意味はわかるのですが、このような書き方が正しいのか調べたところ該当するものがありませんでした。

htsign👍を押しています

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

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

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

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

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

guest

回答4

0

len(s) > k で「文字数が k よりも大きい場合」ですよね。
これが真になると値は True です。そうでなければ False

で、True * 'string' とすると、真偽値が整数に型変換され、 True なら 1False なら 0 になります。
'a' * 1'a''a' * 2'aa' です。では 'a' * 0 はというと、これは '' ですね。

そんなわけで、 (len(s) > k) * '...' とすると真の場合には '...' 偽の場合には '' になりました。

このような書き方が正しいのか

という観点でいくと「言語仕様の面では正しいけど真面目なチーム開発でやられたら迷惑」なやつですね。

投稿2020/06/10 16:36

編集2020/06/10 16:38
htsign

総合スコア870

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

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

nomio

2020/06/11 01:28

回答ありがとうございます。解決しました!
guest

0

これは真偽値を用いた書き方です。

一般的に、条件式に対してはTrue,Falseの2通りの真偽値が返ってきます。
if()の()内に入るような式といえば分かりやすいでしょうか。
もし文字数がkよりも大きければ、len(s)>kの値はTrueとなります。

ここで、真偽値は数値としての特性も持っています。
True = 1, False = 0 です。
ex. print(True + True) → 2
ですので、条件を満たす時には 1 * '...'となり、'...'が出力されます。

投稿2020/06/10 16:28

shake9

総合スコア19

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

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

nomio

2020/06/11 01:28

回答ありがとうございます。解決しました!
guest

0

ベストアンサー

Pythonのboolintのサブクラスであり、数値として扱うことができます。(False0True1です)
また、文字列に*演算子を適用すると、与えた数分繰り返されます。
これらを組み合わせたものになります。

投稿2020/06/10 16:23

kuuote

総合スコア705

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

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

nomio

2020/06/11 01:26

真偽値が数値の役割をしていて、それを文字列の掛け算に利用する発想に気づけませんでした。 ドキュメントのURLも張っていただきありがとうございます。 実はドキュメントのboolの項目も読んでいたのですが、読解力が足りていませんでした。 回答をいただいた中でも一番しっくりきたのでベストアンサーにさせていただだきます。 大変勉強になりました。
guest

0

条件分の結果が、1または0となることを利用した、文字列の掛け算です。

sの文字数がkよりも大きい場合
(len(s)>k)*'...' は、1 * '...' となり、結果、'...'

sの文字数がk以下の場合
(len(s)>k)*'...' は、0 * '...' となり、結果、''

投稿2020/06/10 16:24

YT0014

総合スコア1708

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

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

nomio

2020/06/11 01:28

回答ありがとうございます。解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問