回答編集履歴

3 追記

LouiS0616

LouiS0616 score 30281

2018/02/19 21:36  投稿

nums_4は文字列ですが、mult_number(4)はNoneです。※
対話環境で同じように表示されるからと言って同値だとは全く言えないです。
```Python
>>> "aaa"
'aaa'
>>> print("aaa")
aaa
>>>
>>> type("aaa")
<class 'str'>
>>> type(print("aaa"))
aaa
<class 'NoneType'>
>>>
>>> "aaa" == print("aaa")
aaa
False
>>> assert "aaa" == print("aaa")
aaa
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AssertionError
```
> 複数行の入出力をassertさせる方法がわかりません。
この場合行数は関係ないです。
※ Pythonでは、『戻り値なしの関数の戻り値』はNoneになります。ややこしい。
コメントを受けて
---
multi_numberを文字列を返す関数にしてみましょう。
**リストを返す場合**
```Python
def multi_number(num):
   ret = []
   for i in range(num):
       ret.append(str(num) * (num-i))
   return ret
print(*multi_number(3), sep='\n')
# 普通にfor文でぶん回しても良い
# for row in multi_number(3):
#    print(row)
```
**ジェネレータ関数にする場合**
```Python
def multi_number(num):
   for i in range(num):
       yield str(num) * (num-i)
for row in multi_number(3):
   print(row)
```
慣れるまでは前者を使った方が分かりやすいかもしれませんね。
慣れるまでは前者を使った方が分かりやすいかもしれませんね。
---
忘れてた。
**真の意味で、文字列を返す関数**
```Python
def multi_number(num):
   ret = ''
   for i in range(num):
       ret += str(num) * (num-i) + '\n'
   return ret[:-1]
print(multi_number(3))
```
ret[:-1]したのは最後に改行が重複するのを防ぐためです。
retのまま返して、print関数の引数endに空文字列を指定するのもアリです。
2 追記

LouiS0616

LouiS0616 score 30281

2018/02/19 21:17  投稿

nums_4は文字列ですが、mult_number(4)はNoneです。※
対話環境で同じように表示されるからと言って同値だとは全く言えないです。
```Python
>>> "aaa"
'aaa'
>>> print("aaa")
aaa
>>>
>>> type("aaa")
<class 'str'>
>>> type(print("aaa"))
aaa
<class 'NoneType'>
>>>
>>> "aaa" == print("aaa")
aaa
False
>>> assert "aaa" == print("aaa")
aaa
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AssertionError
```
> 複数行の入出力をassertさせる方法がわかりません。
この場合行数は関係ないです。
※ Pythonでは、『戻り値なしの関数の戻り値』はNoneになります。ややこしい。
※ Pythonでは、『戻り値なしの関数の戻り値』はNoneになります。ややこしい。
コメントを受けて
---
multi_numberを文字列を返す関数にしてみましょう。
**リストを返す場合**
```Python
def multi_number(num):
   ret = []
   for i in range(num):
       ret.append(str(num) * (num-i))
   return ret
print(*multi_number(3), sep='\n')
# 普通にfor文でぶん回しても良い
# for row in multi_number(3):
#    print(row)
```
**ジェネレータ関数にする場合**
```Python
def multi_number(num):
   for i in range(num):
       yield str(num) * (num-i)
for row in multi_number(3):
   print(row)
```
慣れるまでは前者を使った方が分かりやすいかもしれませんね。
1 追記

LouiS0616

LouiS0616 score 30281

2018/02/19 20:38  投稿

nums_4は文字列ですが、mult_number(4)はNoneです。※
```Python
>>> "aaa"
'aaa'
>>> print("aaa")
aaa
>>>
>>> type("aaa")
<class 'str'>
>>> type(print("aaa"))
aaa
<class 'NoneType'>
>>>  
>>> "aaa" == print("aaa")  
aaa  
False  
>>> assert "aaa" == print("aaa")  
aaa  
Traceback (most recent call last):  
 File "<stdin>", line 1, in <module>  
AssertionError  
```
> 複数行の入出力をassertさせる方法がわかりません。  
 
この場合行数は関係ないです。  
 
※ Pythonでは、『戻り値なしの関数の戻り値』はNoneになります。ややこしい。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る