重拾Python

我最初学习的语言就是Python,不记得为什么之后没再用过它。那时候刚有python3,完全没普及。本文从初学者的角度,看看python3在语言层面,有什么有趣的东西。

运算符

python的运算符比常规语言多一点,而且令人印象深刻。

  • 常规运算,+ – * / %
  • 地板除,//;乘方,**
  • 交互模式下有_,上一次输出的字符。
  • 赋值,=。可以多重赋值,比如交换变量
    a = 1
    b = 2
    a, b = b, a
    

    Go貌似也学了这一招。

变量

直接赋值,不需要生命,并且没有任何类型前缀。比如 a = 1。这貌似是python性能低下的主要原因之一——类型推导复杂。

同样可以强转类型,比如float(1)。

字符串

  • immutable
  • ‘和”混用。还有字面值”’…”’用三引号表示,不过python也支持拼接:
    words = ('hello'
             ' '
             'world')
    print(word)
    

    会打印出hello world

  • 字符串索引取值,words[0]。
  • 子串,words[1:3],words[-3:-1](这并不是反迭代器),Go也是这种风格。

列表(list)

我后学的C,接触数组时很头痛,现在想起来真是无辜。string和list的操作基本是统一的,类似STL的string和vector。

  • immutable拷贝。words1 = words[:],我觉得这比JS的语法好太多了。
  • 拼接,[1, 2] + [3, 4] = [1, 2, 3, 4]
  • 末尾元素逗号,[1, 2, 3,]。这个设计很细节。
  • 列表推导,这就厉害了。nlist = [x**2 for i in range(5)],这样做你会得到一个nlist值为1, 4, 9, 16, 25。看起来是一个map的语法糖。可以让一些操作变得更方便。

列表方法

  • append, extend, insert, remove, pop, clear, index, count sort, reverse, copy,

这些操作很普通,注意copy是immutable。

  • del 删除元素,可以del words[0]或del words[1:3],甚至删除对象, del words。

特殊容器

元组(tuple)

python2的tuple貌似需要加括号。python3比较直接:

t = 1 ,'w', 'helo'
print(t) #print (1, w, 'helo')
t2 = 'hi', 
print(t2) #print ('hi',)

只的注意的是t2也是一个元组。

字典(dictionary)

msg = {'from': 'me', 'to': 'you', 'content': 'hi'}
msg['content'] = 'hello'

近期语言的关联表基本都是这么写。字典也支持del操作。查询存在性可以使用in关键词。比如 if ‘me’ in msg。

集合

看起来和字典相似 msg = {‘I’, ‘am’, ‘okay’}。创建新set需要使用set()。和列表相似,也支持集合推导。set和list可以互转。

控制流程

这里除了缩进语法比较独特,就是只有range for。

words = [‘what’, 'are', 'you', 'doing']
for w in words:
  print(w)
for idx in range(10):
  print(idx)

range是一个生成序列的函数。python2还有xrange,不过历史遗留问题,3.x版本已经没了(这个兼容性果然尴尬)。现在你需要生成range(2,10)的列表还得嵌套一层:list(range(2,10))

再者,想拿到索引,需要使用枚举,enumerate()

for i, v in enumerate(words):
  print(i, v)

甚至可以打包数据:

name = ['fat', 'mat', 'gat']
age = ['40', '45', '51']
for n, a in zip(name, age):
  print(name, 'is ', age)

 

由于没有分号。python引入了pass关键词,作为空语句。例如:

while True:
 pass

就是只循环什么都不作。

函数

python需要显式声明函数类型。也就是说用def关键词:

def haha():
  print('haha')
def greet(name, w = 'Hi'):
  print(w, name)

如上所示,还可以带默认型参。这个貌似除了Java,大多语言都可以。你还可以显式指派型参:greet(name=’fat’, w = ‘Hello’)

python也支持变长型参列表,表达上有点像ES7的展开语法。

def say(*words, **manAndWords):
  for w in words:
    print(w)
  for k in manAndWords:
    print(k, 'is ', manAndWords[k])
say('haha ', 'hehe', tom='bad', jerry='good')

根据规定,**型参必须放在*后。

你还可以把list展开当作型参列表(这让我想起了C++的initializer_list<>):

args = [1,3]
range(*args)

lambda表达式

现代语言没lambda表达式都不知道怎么用。python也不例外。

不过,lambda x: x + 1 我不知道谁想出这么二的语法。

lambda表达式大多会引入闭包的问题(除了Java):

def addNum(
  def addX(n):
    return x + n
  return addX
add10 = addNum(10);
print(add10(10)) #print 20

上面的函数是成立的,你完全可以这么写:

addX = lambda x : lambda y : x + y;
add20 = addX(20)

同时python的lambda表达式也捕获外部变量。也就是说你可以这样:

t = 10
f = lambda x : t + x
print(f(10)) #print 20

Print

python3把print语句变成了print()函数。以后暴力调试就得多输入一对括号了…

语言层面应该就这些内容。再来就看有什么有趣的玩具可以做了。

This entry was posted in 杂物间 and tagged . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *