“ while True” หมายความว่าอย่างไรใน Python


91
def play_game(word_list):
    hand = deal_hand(HAND_SIZE) # random init
    while True:
        cmd = raw_input('Enter n to deal a new hand, r to replay the last hand, or e to end game: ')
        if cmd == 'n':
            hand = deal_hand(HAND_SIZE)
            play_hand(hand.copy(), word_list)
            print
        elif cmd == 'r':
            play_hand(hand.copy(), word_list)
            print
        elif cmd == 'e':
            break
        else:
            print "Invalid command."

ในขณะที่อะไรคือความจริง?

ฉันคิดว่า 'ในขณะที่จริง' เป็นชวเลข แต่เพื่ออะไร? ในขณะที่ตัวแปร "มือ" กำลังกำหนดค่า? และจะเกิดอะไรขึ้นถ้าตัวแปร 'มือ' ไม่ได้รับการกำหนดค่า?


1
True เป็นนามแฝงสำหรับ 1. คำถามที่เกี่ยวข้องประเภทหนึ่งที่ฉันถามสามารถพบได้ที่นี่stackoverflow.com/questions/885908/…
Copas

17
@Copas Trueไม่ใช่นามแฝงสำหรับ1. แม้ว่าในหลายภาษา1จะประเมินตามความจริงในบริบทแบบบูลีน
อาดัมเซ

2
adamse: ในบางเวอร์ชันของ Python Trueมีนามแฝง1ว่าไม่ใช่เหรอ? แม้ว่าจะใช่ใน Python เวอร์ชันล่าสุดมีประเภทบูลีนจริง
Ken

1
@adamse, @Ken: quoting from มีอะไรใหม่ใน Python 2.3 - PEP 285 : "มีการเพิ่มประเภทบูลีนใน Python 2.3 ค่าคงที่ใหม่สองค่าถูกเพิ่มใน__builtin__โมดูล True และ False (ค่าคงที่ True และ False ถูกเพิ่มเข้าไปในบิวด์ -ins ใน Python 2.2.1 แต่เวอร์ชัน 2.2.1 นั้นตั้งค่าเป็นค่าจำนวนเต็ม 1 และ 0 เท่านั้นและไม่ใช่ประเภทอื่น) "
Cristian Ciupitu

@adamse ใน python มันไม่ใช่ แต่มีหลายภาษา ฉันถือว่าเป็นคำถามทั่วไปมากกว่า การพูดกับผู้เริ่มต้นในขณะที่ Baba กล่าวว่าเขา / เธอคือ "True is sort of an alias for 1" นั้นถูกต้องสมบูรณ์ ฉันเห็นด้วยใน Python True ไม่ใช่นามแฝงสำหรับ 1 ฉันไม่ได้บอกว่าเป็น
Copas

คำตอบ:


109

while Trueหมายถึงวนตลอดไป whileคำสั่งจะใช้เวลาการแสดงออกและดำเนินการม้วนตัวในขณะที่ประเมินการแสดงออกถึง (บูล) "จริง" Trueมักจะประเมินเป็นบูลีน "จริง" และดำเนินการวนซ้ำไปเรื่อย ๆ มันเป็นสำนวนที่คุณจะคุ้นเคยในที่สุด! ภาษาส่วนใหญ่ที่คุณน่าจะพบมีสำนวนที่เทียบเท่ากัน

โปรดทราบว่าภาษาส่วนใหญ่มักมีกลไกบางอย่างในการหลุดจากลูปในช่วงต้น ในกรณีของ Python มันเป็นbreakคำสั่งในcmd == 'e'กรณีของตัวอย่างในคำถามของคุณ


9
เพื่อความชัดเจนฉันเชื่อว่าคุณสามารถทำได้ในขณะที่ (true == true) ในภาษาส่วนใหญ่ ซึ่งอาจช่วยให้โปรแกรมเมอร์มือใหม่เข้าใจตรรกะเบื้องหลังได้ดีขึ้น
คริส

10
คริสwhile True==Trueน่าเกลียด มันน่าเกลียดพอ ๆ กับwhile 'apples'!='oranges':)
dheerosaur

35
ตามที่ครูคนหนึ่งของฉันชี้ให้เห็น: ถ้าคุณคิดว่าtrue==trueเป็นการปรับปรุงคุณจะหยุดที่ไหน? จะไม่(true==true)==trueดีกว่าเหรอ
Ken

11
@Chris ในที่สุดเราควรทราบว่าค่าบูลีนหรือตัวแปรสามารถใช้แทนนิพจน์ตรรกะได้และ "ในที่สุด" ควรจะเร็วที่สุด
Mark Ransom

6
ในที่สุด @ Mark เราควรทราบว่าบางครั้งต้องใช้ความช่วยเหลือเพิ่มเติมเล็กน้อยเพื่อให้โปรแกรมเมอร์ใหม่เข้าใจตรรกะบูลีนและสิ่งที่คล้ายกัน สิ่งที่ฉันพยายามทำคือช่วยให้เขาเข้าใจ
คริส

53

คำถามของฉัน: ในขณะที่อะไรคือความจริง?

ในขณะที่มีTrueTrue

Trueห่วงในขณะที่จะทำงานตราบเท่าที่ประเมินการแสดงออกเงื่อนไข

เนื่องจากTrueเสมอประเมินTrueเป็นลูปจะทำงานไปเรื่อย ๆ จนกว่าจะมีบางอย่างภายในลูปreturns หรือbreaks


4
นี่คืองูหลาม ไม่มีนิพจน์ในวงเล็บ P
Mike Axiak

เฮ้จุดที่ดี ฉันไม่คุ้นเคยกับการคิดใน Python แม้ว่าฉันคิดว่าคุณสามารถวาง parens ไว้รอบ ๆ ได้ถ้าคุณต้องการ ...
Dagg Nabbit

10

คำถามของฉัน: ในขณะที่อะไรคือความจริง?

ทุกสิ่งที่อยู่ใน () ของคำสั่ง while จะได้รับการประเมินเป็นบูลีน ความหมายถูกแปลงเป็นจริงหรือเท็จ

พิจารณาในแถลงการณ์ while(6 > 5)

ขั้นแรกจะประเมินนิพจน์6 > 5ซึ่งtrueเหมือนกับการพูดwhile(true)

สิ่งใดก็ตามที่ไม่ใช่ FALSE, 0, สตริงว่างเปล่า "", ว่างหรือไม่ได้กำหนดมีแนวโน้มที่จะได้รับการประเมินเป็นจริง

เมื่อแรกเริ่มการเขียนโปรแกรมผมใช้ในการทำสิ่งต่างๆเช่นผมไม่ทราบว่าเป็นความจริงเป็นสิ่งเดียวกับif(foo == true)if(foo)

ดังนั้นเมื่อคุณพูดwhile(true)เหมือนกำลังพูดwhile(true == true)

ดังนั้นเพื่อตอบคำถามคุณ: ในขณะที่ TRUE เป็นจริง


10

ในขณะที่Trueเป็นจริง - เช่นเสมอ นี่คือการวนซ้ำที่ไม่มีที่สิ้นสุด

สังเกตความแตกต่างที่สำคัญที่นี่ระหว่างTrueคำหลักในภาษาที่แสดงถึงค่าคงที่ของประเภทเฉพาะและ 'จริง' ซึ่งเป็นแนวคิดทางคณิตศาสตร์


พูดในทางเทคนิคคุณคิดผิด โครงสร้างหมายถึง "ในขณะที่จริงไม่ใช่เท็จ" คุณจะเห็นความแตกต่างได้หากคุณเขียนwhile(5)ด้วยภาษา C ซึ่งไม่มีบูลีนที่เหมาะสม มันไม่ได้หมายความว่ามันหมายความว่าwhile(5==1) while(5!=0)
Blindy

2
ฉันคิดว่ามันเหมาะสมกว่าที่จะพูดว่า "วนซ้ำไม่สิ้นสุด" สมมติฐานต้องเป็นไปได้ว่าลูปจะถูกขัดจังหวะด้วยการหยุดพักหรือกลับมาในบางจุด ลูป 'ไม่มีที่สิ้นสุด' อย่างแท้จริงคือข้อผิดพลาดของโปรแกรมเมอร์ 'ลูปไม่ จำกัด ' ถูกสร้างขึ้นโดยการออกแบบ
Dagg Nabbit

3
@Blindy: ในภาษาที่พิมพ์ไม่ชัดเจนพร้อมการแคสต์อัตโนมัติคุณสามารถพูดว่า x 'ประเมินเป็น' y ... ไม่ใช่ในขณะที่ 5 ไม่เท่ากับ 0 อย่างเคร่งครัดในขณะที่ 5 เท่ากับจริงอย่างหลวม ๆ
Dagg Nabbit

@Blindy while(5)ในภาษา C หมายถึง while 5เป็นจริงไม่ใช่ในขณะที่trueหรือ0ซึ่งเป็นสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง 5เป็นความจริงเสมอ โดยทั่วไปเมื่อภาษามีคีย์เวิร์ดtrueค่าคงที่เป็นจริง แต่ไม่ใช่ค่าคงที่เท่านั้นที่เป็นจริง ในทำนองเดียวกันfalseไม่จำเป็นต้องเป็นค่าเดียวที่เป็นเท็จ
Chris Dodd


3

Trueอยู่เสมอTrueดังนั้นwhile Trueจะวนซ้ำตลอดไป

whileคำหลักที่ใช้เวลาการแสดงออกและลูปในขณะที่การแสดงออกเป็นความจริง Trueเป็นการแสดงออกที่เป็นจริงเสมอ

เพื่อเป็นตัวอย่างที่ชัดเจนให้พิจารณาสิ่งต่อไปนี้:

a = 1
result = a == 1

ที่นี่a == 1จะกลับมาTrueและด้วยเหตุนี้ใส่ลงไปในTrue resultดังนั้น

a = 1
while a == 1:
  ...

เทียบเท่ากับ:

while True:
  ...

หากคุณไม่เปลี่ยนค่าของaภายในwhileลูป


1
Trueไม่ได้เสมอ เช่นTrue True = False;-)
jathanism

1
@ jathanism- ความจริงก็คือความจริงจุดสิ้นสุดของการคำนวณ
dheerosaur

3

ตามปกติเป็นค่าคงที่ในตัวของTrue Python ในตัวของประเภทบู

คุณสามารถใช้การดำเนินการบูลีนกับประเภทบูล (ที่พรอมต์ python แบบโต้ตอบเป็นต้น) และแปลงตัวเลขเป็นประเภทบูล:

>>> print not True
False
>>> print not False
True
>>> print True or False
True
>>> print True and False
False
>>> a=bool(9)
>>> print a
True
>>> b=bool(0)
>>> print b
False
>>> b=bool(0.000000000000000000000000000000000001)
>>> print b
True

และมี "gotcha" ที่อาจเกิดขึ้นกับสิ่งที่คุณเห็นและสิ่งที่คอมไพเลอร์ Python เห็น:

>>> n=0
>>> print bool(n)
False
>>> n='0'
>>> print bool(n)
True
>>> n=0.0
>>> print bool(n)
False
>>> n="0.0"
>>> print bool(n)
True

เพื่อเป็นการบอกใบ้ถึงวิธีที่ Python จัดเก็บประเภทบูลไว้ภายในคุณสามารถโยนประเภทบูลเป็นจำนวนเต็มและ True จะออกมาเป็น 1 และ False 0:

>>> print True+0
1
>>> print True+1
2
>>> print False+0
0
>>> print False+1
1

ในความเป็นจริงboolประเภทPython เป็นคลาสย่อยของประเภทของ Python int:

>>> type(True)
<type 'bool'>
>>> isinstance(True, int)
True

ส่วนที่สำคัญกว่าของคำถามของคุณคือ "What is while True?" คือ 'อะไรคือความจริง' และข้อสรุปที่สำคัญ: อะไรคือเท็จ?

ขั้นแรกสำหรับทุกภาษาที่คุณกำลังเรียนรู้ให้เรียนรู้สิ่งที่ภาษาถือว่า 'จริง' และ 'เท็จ' Python พิจารณาความจริงแตกต่างจากPerl Truthเล็กน้อย ภาษาอื่น ๆ มีแนวคิดเรื่องจริง / เท็จที่แตกต่างกันเล็กน้อย รู้ว่าภาษาของคุณถือว่าเป็นจริงและเท็จสำหรับการดำเนินการและการควบคุมการไหลที่แตกต่างกันเพื่อหลีกเลี่ยงความปวดหัวในภายหลัง!

มีอัลกอริทึมมากมายที่คุณต้องการประมวลผลบางอย่างจนกว่าคุณจะพบสิ่งที่คุณกำลังมองหา ดังนั้นลูปไม่มีที่สิ้นสุดหรือลูปไม่ จำกัด แต่ละภาษามักจะมีสำนวนของตัวเองสำหรับโครงสร้างเหล่านี้ ต่อไปนี้เป็นลูปแบบไม่มีที่สิ้นสุดของ C ทั่วไปซึ่งใช้ได้กับ Perl:

for(;;) { /* loop until break */ }

/* or */

while (1) {
   return if (function(arg) > 3);
}

while True:รูปแบบเป็นเรื่องธรรมดาในงูหลามลูปไม่แน่นอนด้วยวิธีการของการทำลายออกจากวงบาง เรียนรู้การควบคุมโฟลว์ Python เพื่อทำความเข้าใจว่าคุณแยกออกจากwhile Trueลูปอย่างไร ต่างจากภาษาส่วนใหญ่เช่น Python สามารถมีelseประโยคบนลูปได้ มีตัวอย่างในลิงค์สุดท้าย


1

whileห่วงจะเกิดการโต้แย้งที่มีเงื่อนไข (หมายถึงสิ่งที่เป็นเรื่องปกติจริงหรือเท็จหรือสามารถตีความได้ว่าเป็นเช่นนั้น) Trueและมีเพียงดำเนินการในขณะที่อัตราผลตอบแทนเงื่อนไข

สำหรับwhile True? เงื่อนไขที่แท้จริงที่ง่ายที่สุดก็คือTrueตัวมันเอง! ดังนั้นนี่คือการวนซ้ำที่ไม่มีที่สิ้นสุดโดยปกติจะดีในเกมที่ต้องใช้การวนซ้ำมาก (โดยทั่วไปมากขึ้นจากมุมมองของฉันคือการตั้งค่าตัวแปร "done" บางประเภทเป็น false แล้วทำให้เป็นจริงเพื่อจบเกมและลูปจะมีลักษณะเหมือนwhile not done:หรืออะไรก็ตาม)


1

ในบางภาษา True เป็นเพียงและนามแฝงสำหรับหมายเลข คุณสามารถเรียนรู้เพิ่มเติมว่าเหตุใดจึงเป็นเช่นนี้โดยอ่านเพิ่มเติมเกี่ยวกับตรรกะบูลีนตรรกะแบบบูล


1

เพื่อตอบคำถามของคุณโดยตรง: ในขณะที่เงื่อนไขการวนซ้ำเป็นจริง ซึ่งมันมักจะอยู่ในโค้ดนี้โดยเฉพาะ


0

whileลูปยังคงวนซ้ำจนกว่าเงื่อนไขจะเป็นเท็จ ตัวอย่างเช่น (pseudocode):

i = 0
while i < 10
  i++

การวนซ้ำแต่ละครั้งiจะเพิ่มขึ้นทีละ 1 จนครบ 10 เมื่อถึงจุดนั้นเงื่อนไขi < 10จะไม่เป็นจริงอีกต่อไปและการวนซ้ำจะเสร็จสมบูรณ์

เนื่องจากเงื่อนไขในwhile Trueเป็นไปอย่างชัดเจนและตลอดเวลาtrueการวนซ้ำจะไม่สิ้นสุด (จนกว่าจะแตกออกจากทางอื่นโดยปกติจะเป็นโครงสร้างเช่นเดียวกับbreakภายในตัววง)


0

ไม่มีอะไรที่จะประเมินได้เร็วกว่าTrue Trueดังนั้นจึงเป็นการดีถ้าคุณใช้while Trueแทนwhile 1==1ฯลฯ


0
while True:
    ...

หมายถึงการวนซ้ำที่ไม่มีที่สิ้นสุด

คำสั่ง while มักใช้ของลูป จำกัด แต่การใช้ค่าคงที่ 'True' จะรับประกันการทำซ้ำของคำสั่ง while โดยไม่จำเป็นต้องควบคุมลูป (เช่นการตั้งค่าบูลีนในการวนซ้ำเป็นต้น) เว้นแต่คุณจะต้องการทำลายมัน

ในความเป็นจริง

True == (1 == 1)

0

ในขณะที่ True mean infinite loop โดยปกติจะใช้โดยกระบวนการที่ยาวนาน คุณสามารถเปลี่ยนแปลงได้

while True:

ด้วย

while 1:

0

แม้ว่าคำตอบเหล่านี้ส่วนใหญ่จะถูกต้องในระดับที่แตกต่างกัน แต่ก็ไม่มีคำตอบใดที่กระชับเท่าที่ฉันต้องการ

ใส่เพียงใช้while True:เป็นเพียงวิธีการของการทำงานห่วงว่าจะทำงานต่อไปจนกว่าคุณจะทำลายอย่างชัดเจนออกมาจากมันใช้หรือbreak returnเนื่องจาก True จะประเมินเป็น True เสมอคุณจึงต้องบังคับให้ลูปสิ้นสุดเมื่อคุณต้องการ

while True:
    # do stuff

    if some_condition:
        break

    # do more stuff - code here WILL NOT execute when `if some_condition:` evaluates to True

ในขณะที่ปกติลูปจะถูกตั้งค่าให้ทำงานจนกว่าเงื่อนไข while จะเป็นเท็จหรือถึงจุดสิ้นสุดที่กำหนดไว้ล่วงหน้า:

do_next = True

while do_next:

    # do stuff

    if some_condition:
        do_next = False

    # do more stuff - code here WILL execute even when `if some_condition:` evaluates to True

โค้ดทั้งสองชิ้นนั้นทำสิ่งเดียวกันได้อย่างมีประสิทธิภาพ

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

while Trueรูปแบบ pythonic มากขึ้นนับตั้งแต่ที่คุณรู้ว่าbreakจะทำลายห่วงที่ว่าจุดที่แน่นอนในขณะที่do_next = Falseสามารถทำสิ่งอื่น ๆ do_nextอีกก่อนที่จะมีการประเมินผลต่อไปของ


-4

ทุกสิ่งสามารถเป็น True ได้จนกว่าจะมีการนำเสนอสิ่งที่ตรงกันข้าม นี่คือวิธีการทำงานของความเป็นคู่ มันเป็นวิธีที่เปรียบเทียบกัน สีดำสามารถเป็นจริงได้จนกว่าจะเป็นสีขาว ณ จุดที่เป็นเท็จ สีดำยังสามารถเป็นเท็จจนกว่าจะเป็นสีขาว ณ จุดที่เป็นจริง ไม่ใช่สถานะ แต่เป็นการเปรียบเทียบสถานะตรงกันข้าม ถ้าอย่างใดอย่างหนึ่งเป็นจริงอีกฝ่ายผิด True ไม่ได้หมายความว่าถูกต้องหรือได้รับการยอมรับ เป็นสถานะที่ตรงกันข้ามเสมอเป็นเท็จ มันเป็นความเป็นคู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.