一行if-condition-assignment

时间:2011-10-24 08:15:37

标签: python if-statement

我有以下代码

num1 = 10
someBoolValue = True

如果num120,我需要将someBoolValue的值设置为True;否则什么都不做。所以,这是我的代码

num1 = 20 if someBoolValue else num1

有没有我可以避免...else num1部分让它看起来更干净?相当于

if someBoolValue:
    num1 = 20

我尝试将其替换为...else pass,如下所示:num1=20 if someBoolValue else pass。我得到的只是语法错误。我也不能省略...else num1部分。

14 个答案:

答案 0 :(得分:140)

我认为这在Python中是不可能的,因为你实际上要做的事情可能会扩展到这样的事情:

num1 = 20 if someBoolValue else num1

如果排除else num1,您将收到语法错误,因为我非常确定该作业必须实际返回一些内容。

正如其他人已经提到过的那样,你可以做到这一点,但这很糟糕,因为下次读这段代码时你可能最终会感到困惑:

if someBoolValue: num1=20

出于同样的原因,我不是num1 = someBoolValue and 20 or num1的忠实粉丝。我必须对该行正在做什么三思而后行。

实际实现目标的最佳方式是原始版本:

if someBoolValue:
    num1 = 20

最好的问题是因为你想要做的事情非常明显,你不会混淆自己,也不会让其他人在以后接触到这些代码。

另外,作为旁注,num1 = 20 if someBoolValue是有效的Ruby代码,因为Ruby的工作方式有点不同。

答案 1 :(得分:32)

使用此:

num1 = 20 if someBoolValue else num1

答案 2 :(得分:18)

在一行中:

if someBoolValue: num1 = 20

但不要这样做。通常不期望这种风格。为了清晰和一致,人们更喜欢较长的形式。

if someBoolValue:
    num1 = 20

(同样,应该避免使用驼峰。所以请使用some_bool_value。)

请注意,不存在some_value if predicate部分的内嵌表达式 else不存在,因为如果谓词为false,则不会有返回值。但是,在所有情况下,表达式必须具有明确定义的返回值。这与Ruby或Perl中的用法不同。

答案 3 :(得分:12)

您可以使用以下其中一项:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

答案 4 :(得分:5)

没有。我想你希望像num1 = 20 if someBoolValue这样的东西可行,但事实并非如此。我认为最好的方法是使用if语句编写它:

if someBoolValue:
    num1 = 20

答案 5 :(得分:3)

num1 = 10 + 10*(someBoolValue == True)

这是我的新答案。 先前的答案如下,并且对于所述问题是过度的。 Getting_too_clever == not Good。这是以前的答案...如果你想为True cond添加一个东西而为False添加另一个东西仍然很好:

num1 = 10 + (0,10)[someBoolValue == True]

您提到num1已经有一个应该保留的值。我假设num1 = 10,因为这是帖子的第一个陈述,因此转到20的操作是添加10

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue == True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

产生了这个输出

num1 = 20
someBoolValue = True

答案 6 :(得分:2)

如果肯定要为您编写一行代码,Python 3.8引入了assignment expressions,被亲切地称为“海象运算符”。

:=

someBoolValue and (num := 20)

如果第一个布尔表达式为20,则num将被分配给True。赋值必须在括号内,否则会出现语法错误。

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

答案 7 :(得分:1)

num1 = 20 * someBoolValue or num1

答案 8 :(得分:1)

对于来自Google的未来旅行者来说,这是一种新方法(从python 3.8起可用):

using System.Collections;
 using System.Collections.Generic;
 using System.Transactions;
 using Unity.Collections.LowLevel.Unsafe;
 using UnityEngine;

 public class PlayerMovement : MonoBehaviour
 {
     [SerializeField] private Rigidbody playerBody;
     [SerializeField] private Vector3 inputVector;
     [SerializeField] public float speed = 0.01f;
     [SerializeField] public bool jump;
     [SerializeField] private float turnSpeed = 45;
     [SerializeField] public float jumpForce = 35000f;
     [SerializeField] private bool isOnGround = true;
     [SerializeField] float enemyPushForce = 100;
     public int ingredient;
     public GameManager gameManager;
     public camSwitch cs;
     public float horizontalInput;
     public float verticalInput;
     float playerFacingAngleY;
     private GameObject FocalPoint;


     // Start is called before the first frame update
     void Start()
     {
         //Just making sure we have the rigid body of the game object the script is attached to so we can move it later
         playerBody = gameObject.GetComponent<Rigidbody>();
         FocalPoint = GameObject.Find("Focal Point");
     }

     // Update is called once per frame
     //This is where the player script should be realizing we are using inputs
     void Update()
     {
         horizontalInput = Input.GetAxis("Horizontal");
         verticalInput = Input.GetAxis("Vertical");
         playerFacingAngleY += horizontalInput * turnSpeed;
         Vector3 playerFacingDirection = new Vector3(0, playerFacingAngleY, 0);
         playerBody.rotation = Quaternion.Euler(playerFacingDirection);
         float moveDirectionX = (FocalPoint.transform.position.x - gameObject.transform.position.x) *speed * verticalInput * Time.deltaTime;
         float MoveDirectionY = jumpForce * Physics.gravity.y;
         float moveDirectionZ = (FocalPoint.transform.position.z - gameObject.transform.position.z) * speed * verticalInput * Time.deltaTime;
         Vector3 moveDirection = new Vector3(moveDirectionX, MoveDirectionY, moveDirectionZ);



         playerBody.velocity = moveDirection;

         if (Input.GetKeyDown(KeyCode.Space) && isOnGround == true)
         {
             playerBody.AddForce(Vector3.up * jumpForce, ForceMode.VelocityChange);
             isOnGround = false;
             print("player has jumped");
         }

     }

     private void OnCollisionEnter(Collision collision)
     {
         isOnGround = true;
         if (collision.gameObject.tag == "Enemy")
         {
             Debug.Log("Player ran into an enemy");
             if (cs.inSky == true)
             {
                 speed = 0;
             }
             else
             {
                 speed = 10;
             }
         }
         else if (collision.gameObject.tag == "Ingredient")
         {

             Debug.Log("Player collided with an ingredient");
             collision.gameObject.SetActive(false);
             ingredient++;
         }
         else if (collision.gameObject.tag == "Ground") {
             isOnGround = true;
             print("player has hit the ground");
         }

     }
 }

答案 9 :(得分:0)

如果需要,您可以绝对使用num1 =(如果someBoolValue为20,则为num1)。

答案 10 :(得分:0)

这是我可以建议的。  使用另一个变量派生if子句并将其分配给num1。

代码:

num2 =20 if someBoolValue else num1
num1=num2

答案 11 :(得分:0)

另一种方式 num1 = (20*boolVar)+(num1*(not boolVar))

答案 12 :(得分:0)

如果您希望在布尔值为true的情况下调用方法,则可以放置else None以终止三进制。

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

答案 13 :(得分:0)

您可以这样做。

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

您可以通过这种方式解决问题,但是,使用“ try / except block”不是python的最佳做法。