Python - "agar bo'lmasa"

Quyidagi kodlar

multiples = []
for i in range(1,1000):
    if i % 3 == 0 or i % 5 == 0:
        multiples.append(i)
addition = sum(multiples)
print addition

va

print(sum([i for i in range(1, 1000) if not (i%3 va i%5)]))

Xuddi shu narsani qiling.

Endi agar bo'lmasa qismi ikkinchi kodni qanday hisoblashadi?

Men aytganimdek, birinchi kodda i% 3 == 0 yoki i% 5 == 0 kodi> == 0 .

1
Birinchidan, ular ham xuddi shunday qilmaydilar ... birinchisi ko'p miqdorda keraksiz qo'ng'iroqlarni amalga oshiradi. Biroq, ular xuddi shu narsani chiqaradilar. Python va ko'p tillarda nolinchi noto'g'ri deb hisoblansin va nolga teng emas. Siz so'ragan narsa shumi?
qo'shib qo'ydi muallif Foon, manba
Oh, tez-tez yig'ilgan qo'ng'iroqlar xato edi. Ruxsat etilgan.
qo'shib qo'ydi muallif George, manba

6 javoblar

De Morgan qonunlari dan foydalanib:

i % 3 == 0 or i % 5 == 0

quyidagicha:

not (i % 3 != 0 and i % 5 != 0)

Va pythonda, raqamni booleanga aylantirganda, nolga teng bo'lmagan qiymat True bo'ladi.

agar i% 3! = 0 ni amalga oshirish o'rniga i% 3 dan foydalanishingiz mumkin, chunki 0 kodi False bo'ladi va agar u nol bo'lmasa True bo'ladi.

Here's python's truth table: https://docs.python.org/3.6/library/stdtypes.html#truth

P.S. sum() argument sifatida generatorni qabul qilishi mumkin, shuning uchun siz aslida shunday qilishingiz mumkin:

sum(i for i in range(1, 1000) if not (i%3 and i%5))
12
qo'shib qo'ydi

and and or are boolean operators, not logical & and |. So writing

a == 0 or b == 0

yozish bilan bir xil

not a or not b

Shunday qilib ular ham xuddi shunday qilishadi

Natijada, eng yaxshi usul, sizning shartlaringizdagi mag'lubiyatlardan qochish, qo'shimcha ro'yxatni tushunish emas, balki uni jeneratör tushunchasini ishlatish emas, balki not dan foydalanishni emas, balki nolga qarshi sinovdan o'tmaydi. hammasi oxirigacha. Buni men qilardim:

print(sum(i for i in range(1, 1000) if i%3==0 or i%5==0))
2
qo'shib qo'ydi
Men noto'g'ri yozilgan deb va'da qilaman. Asl kodda jami for loopdan amalga oshirildi.
qo'shib qo'ydi muallif George, manba

Pythonda har bir ob'ektning boolean qiymati bor.

Ularning har biri tamsayılar uchun True 0 tashqari.

Shuning uchun i raqamini 3 bo'linishi mumkin bo'lsa, i% 3 ifodasi 0 bo'ladi. Lekin 0 False ekanligini bilamiz. not operatori bu ifodani bekor qiladi, shuning uchun noto'g'ri kodi True bo'ladi.

Xuddi shu narsa i% 5 uchun ham amal qiladi.

Umid qilamanki yordam beradi.

Har qanday ob'ekt haqiqat qiymati uchun, agar ishlatilsa yoki quyidagi shartlarda yoki Boolean operatsiyalarining operandi sifatida testdan o'tkazilishi mumkin. Quyidagi qiymatlar soxta hisoblanadi:

     
      
  • Yo'q

  •   
  • noto'g'ri

  •   
  • Har qanday raqamli turdagi nol, masalan, 0, 0L, 0.0, 0j.

  •   
  • Har qanday bo'sh bir qator, masalan, '', (), [].

  •   
  • har qanday bo'sh xaritalash, masalan, {}.

  •   
  • Sinf sinfni nolga () yoki len () usulini aniqlasa, bu usul butun sonni nol yoki bool qiymati noto'g'ri. [1]

  •   
     

Boshqa barcha qiymatlar haqiqiy hisoblanadi, shuning uchun ko'p turdagi ob'ektlar har doim to'g'ri.

See also: https://docs.python.org/2/library/stdtypes.html

1
qo'shib qo'ydi

Pythonda 0 odatdagidek noto'g'ri talqin etiladi. Shunday qilib, birinchi kodda i% 3 == 0 kodi emas, balki i% 3 ga mos keladi. Buyruqlar qatoridan misollar:

>>> 6 % 3 == 0
True
>>> not 6 % 3
True
>>> 7 % 3 == 0
False
>>> not 7 % 3
False

0 === false bu yorliq ko'p tillarda paydo bo`ladi va siz uni ishlatmasangiz, biroz chalkash bo`lishi mumkin.

1
qo'shib qo'ydi

Bu Python tamsayıları booleanlara o'zgartiradigan tarzda ta'sir qiladi. i% 3 natijasida i qiymatiga qarab 0, 1 yoki 2 bo'ladi. Python 3.x da (va Python 2.x da sukut bo'yicha, agar ularni qayta tayinlagan bo'lsangiz) barcha nol bo'lmagan tamsayılar noto'g'ri qiymatini baholaydi va nol True .

Bu holda agar bo'lmasa (i% 3) 0, 1 yoki 2 soniga (i% 3) ni baholaydi va not bularni FALSE , To'g'ri , To'g'ri ga o'zgartiradi.

1
qo'shib qo'ydi

qarang, i% 3 == 0 sharti qoniqtirsa rost rost. Endi, pythonda shunday deylik:

 i = 6
 6 % 3 = 0 and 0==0 is true

Shuning uchun natija to'g'ri bo'ladi. Ikkinchi holatda

6 % 3 = 0. 

Endi, boolean 0da noto'g'ri degan ma'noni anglatadi. Demak, bu noto'g'ri degani emas, balki to'g'ri.

0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming