我有以下代码
num1 = 10
someBoolValue = True
如果num1
为20
,我需要将someBoolValue
的值设置为True
;否则什么都不做。所以,这是我的代码
num1 = 20 if someBoolValue else num1
有没有我可以避免...else num1
部分让它看起来更干净?相当于
if someBoolValue:
num1 = 20
我尝试将其替换为...else pass
,如下所示:num1=20 if someBoolValue else pass
。我得到的只是语法错误。我也不能省略...else num1
部分。
答案 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的最佳做法。