python笔记55-有哪些 pythonic 的优雅语法能让你面试加分?

前言

现在面试的时候经常会考几个 python 基础的代码题,从答题者的解答代码就很容易看出一个人的代码水平。
一般笔试考代码题,主要是考察应聘者的代码是解决的这一个问题,还是这一类的问题?

交换

如何交换a和b的值? 如:a=1, b=2

先看第一个同学的答案

a = 1
b = 2

a = a+b
b = a-b
a = a-b
print(a, b)

上面的解决思路虽然能得到b=1, a=2 但是解决的只是a和b都是数字的情况,解决的是这一个问题,而不是这一类的问题
题目的重点在于交换两个字,如歌a="abc",b=2,那么很明显上面的答案就会被推翻。

接下来看第二个同学的答案

a = 1
b = 2

# 用一个中间变量temp
temp = a
a = b
b = temp
print(a, b)

这一个用中间变量temp,就解决了交换的问题,也是一个很常见的解决问题的思路,只能算是及格,挑不出毛病。

再继续看第三个同学的答案

a = 1
b = 2

a, b = b, a
print(a, b)

很明显第三个同学的答案又简介又优雅,还是很地道的 python 语法,这就是我们说的很 pythonic ,面试官一看就会有好的印象。

三元表达式

如果分数(score)小于60分,就认为成绩(result)是"不及格", 大于等于60分,认为成绩是"及格"

于是这题写个 if 判断就可以了,没什么难度

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/


score = 90

if score < 60:
    result = "不及格"
else:
    result = "及格"
print(result)

如果学过其它编程语言应该知道有个三目运算符,如C++ ?:条件运算符(三目运算符) 用法

条件运算符强大而独特,它提供了一种表达简单 if-else 语句的简写方法。该运算符由问号(?)和冒号(:)组成,其格式如下:

表达式 ? 表达式 : 表达式 ;

以下是使用条件运算符的语句示例:

x < 0 ? y = 10 : z = 20;

这个语句被称为条件表达式,它由 3 个子表达式组成,使用问号 ? 和冒号 : 分隔。这 3 个表达式分别是:x<0,y = 10 和 z = 20。

上面的条件表达式与以下 if-else 语句执行相同的操作:

if (x < 0)
    y = 10;
else
    z = 20;

java里面的三元表达式如下

int a = 1;
String b = "";
b =  a > 1? "执行表达式1":"执行表达式2"
System.out.println(b)

python里面其实也有类似这种语法

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/


score = 90

result = "不及格" if score < 60 else "及格"
print(result)

也可以在函数返回的时候用

def score_result(score: int):
    """根据分数返回成绩"""
    return "不及格" if score < 60 else "及格"

if __name__ == '__main__':
    score = 90
    print(score_result(score))

这种三元表达式的写法即简介又优雅,这就很 pythonic !

列表推导式

已知一个列表a = [1, -2, 3, -5, 7], 如何得到一个新的列表,把列表中的负数变成正数,得到[1, 2, 3, 5, 7]

对于这种列表题,很多小伙伴第一想到的解决办法就是先定义一个空的列表,然后for循环,挨个添加进去,如下

a = [1, -2, 3, -5, 7]

b = []
for i in a:
    b.append(abs(i))
print(b)

虽然上面的代码也解决的问题,接下来看下更优雅的解决方式,使用列表推导式

a = [1, -2, 3, -5, 7]

b = [abs(i) for i in a]
print(b)

前面说了,面试考察的是你解决的是这一个问题,还是这一类的问题,只要是关于在原来列表基础上生成新的列表,都应该尽量使用列表推导式来解决。

比如上面的题变换下,如果a = [1, -2, 3, -5, 7], 列表中如果有负数,那么就计算它的平方,如得到新的列表[1, 4, 3, 25, 7]

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/


a = [1, -2, 3, -5, 7]

b = [i if i > 0 else i**2 for i in a]
print(b)

列表推导式可以结合上面的三元表达式,于是就可以优雅的解决上面的问题了,这就很 pythonic !

写代码就像写文章一样,优雅的代码会让人眼前一亮,回味无穷!
如果你写的文章是:我从桥上走了下来,就像我轻轻的走上来一样,我摆了摆手,跟夕阳再见了! (这是直男的文章)
徐志摩的文章是:轻轻的我走了,正如我轻轻的来;我轻轻的招手,作别西天的云彩。 (这是渣男的文章)

原文地址:https://www.cnblogs.com/yoyoketang/p/14383369.html