很早就听说python的赫赫大名了,这学期学校也开了这门课,正好可以感受一下这门语言的魅力,对比C/C++/JAVA,它到底有什么独特的地方呢?
"Life is short, you need Python" --Bruce Eckel
人生苦短,我用python
一. 初印象:short
曾经有这样一个段子,说联合国同样一份档案,用五大官方语言写的不同版本中,最薄的那份一定是汉语的。
这个段子放在python身上同样也成立,几大主流语言写同样一个功能,python的代码量一定是最短的那个。
比如同样是hello world
C/C++需要五行:
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
java也需要五行,但代码量明显比上面的要多:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
再看看java的“小弟”javascript:
<html>
<head>
<title>第一个JavaScript程序</title>
</head>
<bdoy>
<script type="text/javascript">
document.write("Hello World!"); // 输出语句
</script>
</body>
</html>
php:
<html>
<head>
<title>PHP 测试</title>
</head>
<body>
<?php
echo '<p>Hello World</p>'; ?>
</body>
</html>
js和php排除必要的html标签,也需要一两行,再看看python:
print("Hello World")
只需要一行,简单到没朋友,难怪连小学生都可以轻易上手
这只是python代码简短的冰山一角,它几乎每一部分都是围绕"short"
来设计的
二、灵活
即使只看列表这一节,也能感受到python的语法是相当灵活的
1. 使用列表推导式
生成列表
#生成含0到9的列表
list = [ x for x in range(10)]
#[0,1,2,3,4,5,6,7,8,9]
#生成指定列表中平方大于200的数的列表
list = [10, 20, 30, 40, 50, 60]
result = [x for x in list if x * x > 200]
#[20, 30, 40, 50, 60]
列表推导式可以看成是for循环的一种简写
,使得生成列表的过程变得十分简单。
2. 使用切片操作列表
举个简单的例子:
list = [x for x in range(10)]
#list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#从list中下标0开始,到下标8结束,间隔为2取列表中的元素
result = list[0:8:2]
#result = [0, 2, 4, 6]
事实上,切片的功能远非如此,列表的增删改查都可以通过切片实现
#逆置
result = list[::-1]
#删除列表下标为0,1,2的元素
list[:3] = []
#将列表偶数位赋值为0
list[::2] = [0] * (len(list)//2)
切片更多的操作这里就不再赘述,总之这个操作十分灵活
,但有时却不能一眼看出操作实际目的,可读性低
4. 解包压包,让代码效率如此之高
序列解包,最简单的理解就是将列表,集合等序列里的元素剥离出来,而压包则是相反的过程
最简单的解包:
x, y, z = [1, 2, 3]
#x = 1, y = 2, z = 3
利用这个功能就可以非常简便地实现交换
x, y, z = z, x, y
# x = 3, y = 1, z = 2
也可以替代切片操作(表示多个元素,_表示忽略元素,_表示忽略多个元素)
x, *y, z = [1, 2, 3, 4, 5]
# x = 1
# y = [2, 3, 4]
# z = 5
x, *_, z = [1, 2, 3, 4, 5]
# x = 1
# z = 5
还可以让函数返回多个值:
def testFun(name, number):
return 'name:' + name, 'age:' + number
name, number = testFun('zhangsan', '24')
print(name, number)
# name:zhangsan age:24
最简单的压包:
key = ['name', 'age', 'number']
value = ['zhangsan', 12, 1000]
person = dict(zip(key, value))
#person = {'name': 'zhangsan', 'age': 12, 'number': 1000}
解包与压包混用:
data = [
('Bob', '1990-1-1', 60),
('Mary', '1996-1-4', 50),
('Nancy', '1993-3-1', 55)
]
for name, *args in data:
print(name, args)
# Bob ['1990-1-1', 60]
# Mary ['1996-1-4', 50]
# Nancy ['1993-3-1', 55]
在函数当中使用(可变参数)与*(关键字参数,将实参解释为键值对):
def myfun(first, *middle, last, ** keyAndValue):
print('first = ', first)
print('middle = ', middle)
print('last = ', last)
print('keyAndValue = ', keyAndValue)
myfun(1,2,3, last = 4, name = 'zhangsan', age = 1)
# first = 1
# middle = (2, 3)
# last = 4
# keyAndValue = {'name': 'zhangsan', 'age': 1}
利用*
与**
混用表示任意参数,例如在装饰器模式中:
def mydecorator(func):
def wrapper(*args, **kw):
print('一个装饰器')
return func(*args, **kw)
return wrapper
@mydecorator
def myfun(name, age, number):
print(name, age, number)
myfun('zhangsan', 24, 1000)
wrapper函数使用*args
, **kw
作为参数,则被修饰的myfun函数需要的参数无论是什么样的,传入wrapper都不会报错,这保证了装饰器可以修饰各种各样函数的灵活性。
总结
python刚入门,确实被它简洁的语法给深深吸引了,甚至一度怀疑自己是在敲指令,而非写代码,但它的灵活多变的特性也使得程序在我写完没过几天,就完全看不懂了,即使是一个逗号,冒号也会隐藏大量细节,而这样的细节通常很难debug出来。代码太过简洁,有利也有弊。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。