อะไรคือความแตกต่างระหว่าง `raw_input () 'และ` อินพุต ()' ใน Python 3


362

อะไรคือความแตกต่างระหว่างraw_input()และinput()ใน Python 3


3
คุณสร้างโปรแกรมที่ใช้งานได้กับทั้ง Python 2 และ Python 3 ได้อย่างไร
โซโลมอน Ucko

2
จะทำอย่างไรให้คุณลองชุดinputไปraw_inputและไม่สนใจข้อผิดพลาดชื่อ
โซโลมอน Ucko

3
ค้นหาไลบรารี่ 'six' เพื่อรับความเข้ากันได้ของ python 2 และ 3
Jack Homan

คำตอบ:


418

ความแตกต่างคือraw_input()ไม่มีใน Python 3.x ขณะinput()นั้น ที่จริงเก่าraw_input()ได้รับการเปลี่ยนชื่อinput()และเก่าinput()จะหายไป eval(input())แต่สามารถจำลองโดยใช้ (โปรดจำไว้ว่านั่นeval()คือสิ่งชั่วร้ายลองใช้วิธีการแยกวิเคราะห์ข้อมูลของคุณอย่างปลอดภัยยิ่งขึ้นถ้าเป็นไปได้)


93
"อะไรคือความแตกต่างระหว่างraw_input... ?" - "ความแตกต่างคือไม่มีraw_input" ... ค่อนข้างแตกต่างฉันจะพูด!
ivan_pozdeev

9
ใน Python 2 ฉันเดาว่าพวกเขาสันนิษฐานว่าโปรแกรมเมอร์ต้องการ "รัน" จริง ๆ เป็นคำสั่งที่ผู้ใช้ป้อนตั้งแต่เริ่มแรก (ฉันเดา) การร้องขออินพุตจากผู้ใช้อาจเป็นเพราะ แต่เมื่อพวกเขารู้ว่าโปรแกรมเมอร์อาจต้องการรับอินพุต "ดิบ" พวกเขาออกแบบฟังก์ชันอื่นที่เรียกว่า "raw_input" ใน Python 3 พวกเขาสังเกตเห็นว่าอะไรโง่และลบการดำเนินการเริ่มต้นของอินพุตดั้งเดิมโดยยอมให้มีฟังก์ชั่นง่าย ๆ เพียงตัวเดียว
JC Rocamonde

1
Repl.it ทำงาน Py3.5.1 มี raw_input () เป็นคำหลัก
OldBunny2800

2
จะต้องมีการกล่าวว่าeval(และexec) โดยทั่วไปควรหลีกเลี่ยงเพราะอาจมีความเสี่ยงด้านความปลอดภัย สำหรับรายละเอียดโปรดดูEval มันอันตรายจริงๆโดยทหารผ่านศึก Ned Batchelder และแน่นอนว่าคำแนะนำนั้นใช้ได้กับ Python 2 รุ่นเก่าinputด้วย
PM 2Ring

1
@ PM2Ring ฉันเพิ่มคำเตือนไปยังคำตอบ แน่นอนมีกรณีการใช้งานที่ถูกต้องสำหรับทั้งสองeval()และexec()แต่คุณต้องเข้าใจก่อนว่าทำไมคุณไม่ควรใช้eval()ก่อนตัดสินใจใช้งาน
Sven Marnach

192

ในหลาม2 , raw_input()ส่งกลับสตริงและinput()พยายามที่จะเรียกการป้อนข้อมูลที่เป็นนิพจน์หลาม

นับตั้งแต่ได้รับสตริงก็เกือบจะเสมอสิ่งที่คุณต้องการ, Python 3 input()ไม่ว่าด้วย ดังที่สเวนบอกว่าหากคุณต้องการพฤติกรรมเก่าeval(input())


7
คุณควรเพิ่มว่างูหลาม 3 raw_input()ไม่ได้
Martin Thoma

การใช้งานอินพุตเป็นนิพจน์ไพ ธ อนคืออะไร
Akshay Vijay Jain

1
@AkshayVijayJain อาจเป็นเพราะมีไว้เพื่อป้อนหมายเลข แต่มันไม่ปลอดภัยโดยสิ้นเชิง
MarSoft

112

Python 2:

  • raw_input() ใช้สิ่งที่ผู้ใช้พิมพ์และส่งกลับเป็นสตริง

  • input()ใช้ครั้งแรกraw_input()แล้วดำเนินการeval()กับมันเช่นกัน

ความแตกต่างที่สำคัญคือinput()คาดว่าคำสั่งหลามที่ถูกต้องทางไวยากรณ์ที่raw_input()ไม่

Python 3:

  • raw_input()ถูกเปลี่ยนชื่อเป็นinput()ดังนั้นตอนนี้input()ส่งคืนสตริงที่แน่นอน
  • เก่าinput()ถูกลบ

หากคุณต้องการที่จะใช้เก่าซึ่งหมายความว่าคุณต้องประเมินการป้อนข้อมูลของผู้ใช้เป็นคำสั่งหลามคุณต้องทำมันด้วยตนเองโดยใช้input()eval(input())


26

ใน Python 3 raw_input()ไม่มีอยู่ซึ่ง Sven พูดถึงแล้ว

ใน Python 2 input()ฟังก์ชันจะประเมินค่าอินพุตของคุณ

ตัวอย่าง:

name = input("what is your name ?")
what is your name ?harsha

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    name = input("what is your name ?")
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

ในตัวอย่างด้านบน Python 2.x พยายามประเมิน harsha เป็นตัวแปรแทนที่จะเป็นสตริง เพื่อหลีกเลี่ยงปัญหานี้เราสามารถใช้เครื่องหมายคำพูดคู่รอบข้อมูลที่เราป้อนเช่น "harsha":

>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha

raw_input ()

ฟังก์ชั่น raw_input () `ไม่ได้ประเมินมันจะอ่านสิ่งที่คุณป้อน

ตัวอย่าง:

name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'

ตัวอย่าง:

 name = eval(raw_input("what is your name?"))
what is your name?harsha

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name = eval(raw_input("what is your name?"))
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

ในตัวอย่างด้านบนฉันแค่พยายามประเมินอินพุตของผู้ใช้ด้วยevalฟังก์ชัน


7

ฉันต้องการที่จะเพิ่มรายละเอียดเล็ก ๆ น้อย ๆ ที่จะอธิบายให้โดยทุกคนสำหรับหลามผู้ใช้ 2 คน raw_input()ซึ่งตอนนี้คุณรู้ว่าจะประเมินว่าข้อมูลใดที่ผู้ใช้ป้อนเป็นสตริง ซึ่งหมายความว่าหลามไม่พยายามแม้แต่จะเข้าใจข้อมูลที่ป้อนอีกครั้ง ทั้งหมดที่จะพิจารณาคือข้อมูลที่ป้อนจะเป็นสตริงไม่ว่าจะเป็นสตริงจริงหรือ int หรืออะไรก็ตาม

ในขณะที่input()ในอีกทางหนึ่งพยายามที่จะเข้าใจข้อมูลที่ป้อนโดยผู้ใช้ ดังนั้นอินพุตhelloworldจะแสดงข้อผิดพลาดเป็น ' helloworld is undefined'

โดยสรุปสำหรับpython 2เพื่อป้อนสตริงด้วยคุณต้องป้อนเหมือน ' helloworld' ซึ่งเป็นโครงสร้างทั่วไปที่ใช้ในหลามเพื่อใช้สตริง


3

หากคุณต้องการให้แน่ใจว่ารหัสของคุณกำลังทำงานกับ python2 และ python3 ให้ใช้ฟังก์ชันอินพุต () ในสคริปต์ของคุณและเพิ่มสิ่งนี้เพื่อเริ่มต้นสคริปต์ของคุณ:

from sys import version_info
if version_info.major == 3:
    pass
elif version_info.major == 2:
    try:
        input = raw_input
    except NameError:
        pass
else:
    print ("Unknown python version - input function not safe")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.