回答編集履歴

8

一部手直し

2023/04/23 01:56

投稿

melian
melian

スコア21118

test CHANGED
@@ -17,24 +17,25 @@
17
17
 
18
18
  **追記**
19
19
 
20
- `eval()` を使うのであれば、以下の様な感じに。(かなり無理がありますが)
20
+ `eval()` を使う場合は以下の様な感じに。
21
21
  ```python
22
22
  def yes_or_no(prompt):
23
23
  ans = input(f'{prompt} [yes/no]').strip().lower()
24
24
  return 'yes' if ans in ('yes', 'y') else 'no'
25
25
 
26
26
  def eval_qa(reply, yn):
27
- ans = eval(reply, yn)
27
+ ans = eval(yes_or_no(reply), yn)
28
28
  return ans() if callable(ans) else ans
29
29
 
30
+ if __name__ == '__main__':
31
+ test = lambda: eval_qa('実際の年齢よりも、年上にみられることが多い',
32
+ {'yes': loud, 'no': dext})
33
+ loud = lambda: eval_qa('声がでかい',
34
+ {'yes': '人前で注目を浴びるのが好き', 'no': dext})
30
- dext = lambda: eval_qa(yes_or_no('手先が器用で、結構まめだ。簡単な料理は作れる。'),
35
+ dext = lambda: eval_qa('手先が器用で、結構まめだ。簡単な料理は作れる。',
31
- {'yes': '好きなことには、ご飯を忘れても熱中する方',
36
+ {'yes': '好きなことには、ご飯を忘れても熱中する方',
32
- 'no': '君はクラス一のひょうきん君'})
37
+ 'no': '君はクラス一のひょうきん君'})
33
- loud = lambda: eval_qa(yes_or_no('声がでかい'),
34
- {'yes': '人前で注目を浴びるのが好き', 'no': dext})
35
- test = lambda: eval_qa(yes_or_no(f'実際の年齢よりも、年上にみられることが多い'),
36
- {'yes': loud, 'no': dext})
37
38
 
38
- print(test())
39
+ print(test())
39
40
  ```
40
41
 

7

eval を利用する例を書き直し

2023/04/23 01:21

投稿

melian
melian

スコア21118

test CHANGED
@@ -23,13 +23,18 @@
23
23
  ans = input(f'{prompt} [yes/no]').strip().lower()
24
24
  return 'yes' if ans in ('yes', 'y') else 'no'
25
25
 
26
+ def eval_qa(reply, yn):
26
- loud = lambda: eval(eval(yes_or_no('声がでかい'),
27
+ ans = eval(reply, yn)
27
- {'yes': '"人前で注目を浴びるのが好き"', 'no': 'dext()'}))
28
- dext = lambda: eval(yes_or_no('手先が器用で、結構まめだ。簡単な料理は作れる。'),
29
- {'yes': '好きなことには、ご飯を忘れても熱中する方',
30
- 'no': '君はクラス一のひょうきん君'})
28
+ return ans() if callable(ans) else ans
31
29
 
30
+ dext = lambda: eval_qa(yes_or_no('手先が器用で、結構まめだ。簡単な料理は作れる。'),
31
+ {'yes': '好きなことには、ご飯を忘れても熱中する方',
32
+ 'no': '君はクラス一のひょうきん君'})
33
+ loud = lambda: eval_qa(yes_or_no('声がでかい'),
34
+ {'yes': '人前で注目を浴びるのが好き', 'no': dext})
32
- print(eval(eval(yes_or_no(f'実際の年齢よりも、年上にみられることが多い'),
35
+ test = lambda: eval_qa(yes_or_no(f'実際の年齢よりも、年上にみられることが多い'),
33
- {'yes': 'loud()', 'no': 'dext()'})))
36
+ {'yes': loud, 'no': dext})
37
+
38
+ print(test())
34
39
  ```
35
40
 

6

一部整形

2023/04/21 06:52

投稿

melian
melian

スコア21118

test CHANGED
@@ -2,18 +2,17 @@
2
2
 
3
3
  `eval()` や `exec()` は使っていないので、ご要望を満たすものではありませんが、分岐(branch)構造を nested tuple で表現して利用する方法を参考までに回答します。
4
4
  ```python
5
- dexterous = ('手先が器用で、結構まめだ。簡単な料理は作れる。',
5
+ dext = ('手先が器用で、結構まめだ。簡単な料理は作れる。',
6
- ('好きなことには、ご飯を忘れても熱中する方', '君はクラス一のひょうきん君'))
6
+ ('好きなことには、ご飯を忘れても熱中する方', '君はクラス一のひょうきん君'))
7
+ loud = ('声がでかい', ('人前で注目を浴びるのが好き', dext))
7
- test = ('実際の年齢よりも、年上にみられることが多い',
8
+ test = ('実際の年齢よりも、年上にみられることが多い', (loud, dext))
8
- (('声がでかい',
9
- ('人前で注目を浴びるのが好き', dexterous)),
10
- dexterous))
11
9
 
12
10
  if __name__ == '__main__':
11
+ p = test # shallow copy
13
- while isinstance(test, tuple):
12
+ while isinstance(p, tuple):
14
- ans = input(f'{test[0]} [yes/no]')
13
+ ans = input(f'{p[0]} [yes/no]')
15
- test = test[1][ans != 'yes']
14
+ p = p[1][ans != 'yes']
16
- print(test)
15
+ print(p)
17
16
  ```
18
17
 
19
18
  **追記**

5

2023/04/19 21:09

投稿

melian
melian

スコア21118

test CHANGED
@@ -20,12 +20,17 @@
20
20
 
21
21
  `eval()` を使うのであれば、以下の様な感じに。(かなり無理がありますが)
22
22
  ```python
23
+ def yes_or_no(prompt):
23
- dext = lambda: eval(input(f'手先が器用で、結構まめだ。簡単な料理は作れる。 [yes/no]'),
24
+ ans = input(f'{prompt} [yes/no]').strip().lower()
24
- {'yes': '好きなことには、ご飯を忘れても熱中する方', 'no': '君はクラス一のひょうきん君'})
25
+ return 'yes' if ans in ('yes', 'y') else 'no'
26
+
25
- loud = lambda: eval(eval(input(f'声がでかい [yes/no]'),
27
+ loud = lambda: eval(eval(yes_or_no('声がでかい'),
26
28
  {'yes': '"人前で注目を浴びるのが好き"', 'no': 'dext()'}))
29
+ dext = lambda: eval(yes_or_no('手先が器用で、結構まめだ。簡単な料理は作れる。'),
30
+ {'yes': '好きなことには、ご飯を忘れても熱中する方',
31
+ 'no': '君はクラス一のひょうきん君'})
27
32
 
28
- print(eval(eval(input(f'実際の年齢よりも、年上にみられることが多い [yes/no]'),
33
+ print(eval(eval(yes_or_no(f'実際の年齢よりも、年上にみられることが多い'),
29
34
  {'yes': 'loud()', 'no': 'dext()'})))
30
35
  ```
31
36
 

4

2023/04/19 20:43

投稿

melian
melian

スコア21118

test CHANGED
@@ -18,12 +18,14 @@
18
18
 
19
19
  **追記**
20
20
 
21
- `eval()` を使うとすれば、以下の様にするとよいかもしれません。(無理すが)
21
+ `eval()` を使うのであれば、以下の様な感じに。(かなり無理があすが)
22
+ ```python
23
+ dext = lambda: eval(input(f'手先が器用で、結構まめだ。簡単な料理は作れる。 [yes/no]'),
24
+ {'yes': '好きなことには、ご飯を忘れても熱中する方', 'no': '君はクラス一のひょうきん君'})
25
+ loud = lambda: eval(eval(input(f'声がでかい [yes/no]'),
26
+ {'yes': '"人前で注目を浴びるのが好き"', 'no': 'dext()'}))
22
27
 
23
- ```python
24
- if __name__ == '__main__':
25
- yes, no = 0, 1
26
- while isinstance(test, tuple):
27
- test = test[1][eval(input(f'{test[0]} [yes/no]'))]
28
+ print(eval(eval(input(f'実際の年齢よりも、年上にみられることが多い [yes/no]'),
28
- print(test)
29
+ {'yes': 'loud()', 'no': 'dext()'})))
29
30
  ```
31
+

3

2023/04/19 12:01

投稿

melian
melian

スコア21118

test CHANGED
@@ -15,3 +15,15 @@
15
15
  test = test[1][ans != 'yes']
16
16
  print(test)
17
17
  ```
18
+
19
+ **追記**
20
+
21
+ `eval()` を使うとすれば、以下の様にするとよいかもしれません。(無理やりですが)
22
+
23
+ ```python
24
+ if __name__ == '__main__':
25
+ yes, no = 0, 1
26
+ while isinstance(test, tuple):
27
+ test = test[1][eval(input(f'{test[0]} [yes/no]'))]
28
+ print(test)
29
+ ```

2

2023/04/19 06:04

投稿

melian
melian

スコア21118

test CHANGED
@@ -6,8 +6,8 @@
6
6
  ('好きなことには、ご飯を忘れても熱中する方', '君はクラス一のひょうきん君'))
7
7
  test = ('実際の年齢よりも、年上にみられることが多い',
8
8
  (('声がでかい',
9
- ('人前で注目を浴びるのが好き', dexterous)),
9
+ ('人前で注目を浴びるのが好き', dexterous)),
10
- dexterous))
10
+ dexterous))
11
11
 
12
12
  if __name__ == '__main__':
13
13
  while isinstance(test, tuple):

1

2023/04/19 06:00

投稿

melian
melian

スコア21118

test CHANGED
@@ -12,6 +12,6 @@
12
12
  if __name__ == '__main__':
13
13
  while isinstance(test, tuple):
14
14
  ans = input(f'{test[0]} [yes/no]')
15
- test = test[1][0 if ans == 'yes' else 1]
15
+ test = test[1][ans != 'yes']
16
16
  print(test)
17
17
  ```