python语言学习备忘

作为一个有多年Java开发经验的老程序员,最近却被python精练的语法迷住了。同时发现python语言在云计算、系统运维领域确实用得很多,感觉有必要把python这门语言学一学。以下记录了学习过程中的关键点以备忘。

语言关键点

  • 数字特殊计算符号

print4**3

print17//3.0

  • 复数支持

print3+4j

print (3+4j).real

print (3+4j).imag

print abs(3+4j)

  • 字符串

print'abcdef'

printr'abc\ndef'

print'''abc

def

ghi

'''

print'abc\

def\

ghi'

'abc'+'def'

'abc'*3

  • unicode与str之间相互转换

printu'中国'

unicodestr=u'中国'

utf8str=unicodestr.encode('utf-8')

unicodestr2=utf8str.decode('utf-8')

  • list与slice
list1=[1, 2, 3, 4]
print list1[3]
print list1[1:]
print list1[:3]
print list1[::2]

  • 流程控制
if a<b:
  print a
elif a==b:
  print a
else:
  print b

list1=[1, 2, 3, 4]
for num in list1:
  print num

for idx in range(len(list1)):
  print idx

for (idx, num) in enumerate(list1):
  print idx, num

for num in list1:
  if num==3:
    break

for num in list1:
  if num==3:
    continue

  print num

while running:
  print 'alive'

if 3==3:
  pass

  • 函数相关
def fun1(a, b):
  print a+b

def fun2(a, b=4):
  print a+b

def cheeseshop(kind, *arguments, **keywords):
  pass

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper='Michael Palin',
           client="John Cleese",
           sketch="Cheese Shop Sketch")

pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])

def fun3(a, b)
  '''Calculate a+b

  Comment here
  '''
  pass

  • list作为堆栈

stack=[3, 4, 5]

stack.append(6)

print stack.pop()

  • 队列
from collections import deque
queue = deque([3, 4, 5])
queue.append(6)
queue.popleft()

  • filter, map, reduce
filter(lambda x: x%3==0 or x%5==0, range(1, 100))

map(lambda x: x*2, range(1, 10))

reduce(lambda x, y: x+y, range(1, 10))

  • 列表推导

1

[num*2 for num in range(1, 10) if num%4!=0]

  • 删除变量、删除list子项
a=3
b=a
del a

list1=[1,2,3,4,5]
del list1[3]
del list1[:]

  • tuple元组
t = 12345, 54321, 'hello!'

a, b=b,a

  • set集合
fruit = set(['apple', 'orange', 'apple', 'pear', 'orange', 'banana'])
print 'orange' in fruit

a={'a', 'b', 'c'}

a = set('abracadabra')
b = set('alacazam')
print a-b
print a|b
print a&b
print a^b

  • set集合推导式

1

print {x for x in 'abracadabra' if x not in 'abc'}

  • dict字典
tel = {'jack': 4098, 'sape': 4139}

dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])

dict(sape=4139, guido=4127, jack=4098)

  • dict字典推导式

1

{x: x**2 for x in (2, 4, 6)}

  • 模块

print __name__

import sys

print sys.path

print sys.argv

  • 格式化输出
print '%d + %d = %d' % (3, 4, 5) //不建议使用这种旧的语法

print '{} + {} = {}'.format(3, 4, 5)

print '{0} + {1} = {2}'.format(3, 4, 5)

print '{num1} + {num2} = {num3}'.format(num1=3, num2=4, num3=5)

print '{num1:.2f} + {num2:.2f} = {num3:.2f}'.format(num1=3, num2=4, num3=5)

print '{num1:4d} + {num2:4d} = {num3:4d}'.format(num1=3, num2=4, num3=5)

from string import Template
print Template('$who likes $what').substitute(who='tim', what='kung pao')

tel = {'jack': 4098, 'sape': 4139}
print json.dumps(tel, indent=2)

  • 文件读写
f=open('/somewhere/filename', 'w')

f.read()

for line in f:
  print line,

f.close()

  • json处理
import json

f=open('/somewhere/filename', 'w')

tel = {'jack': 4098, 'sape': 4139}
json.dumps(tel, f)
f.close()

f=open('/somewhere/filename', 'r')
x=json.load(f)

  • 异常

try:

pass

except ValueError as e:

pass

finally:

pass

deffun1():

raise ValueError('something')

classMyError(Exception):

def__init__(self, value):

self.value = value

def__str__(self):

return repr(self.value)

  • with语法
with open('/somewhere/filename', r) as f:
  for line in f:
    print line,

  • 类的定义
class MyClass(BaseClass):

  pubPro=None

  def __init__(self, arg1):
    BaseClass.__init__(self)
    self.arg1 =

  def pubFun1(self, arg1, arg2):
    pass

  def __priFun1(self, arg1):
    pass

cls=MyClass('hello')
print type(cls)
print cls.__class__

  • 生成器
def reverse(data):
  for index in range(len(data)-1, -1, -1):
    yield data[index]

for char in reverse('golf'):
  print char

  • 标准库
import os
print os.getcwd()
os.chdir('/somewhere')
os.system('ping -c 4 127.0.0.1')

import shutil
shutil.copyfile('/somewhere/filename', '/anotherwhere/filename')

import glob
print glob.glob('*.py')

import sys
sys.exit(0)
sys.stderr.write('err msg')
sys.stdout.write('output msg')

import re
print re.findall(r'([a-z]+)', 'which foot or hand fell fastest')

import math
math.cos(math.pi / 4.0)
math.log(1024, 2)

import random
random.choise(['apple', 'pear', 'banana'])
random.sample(xrange(100), 10)
random.random()
random.randrange(6)

import urllib2
f=urllib2.urlopen('http://www.baidu.com')
for line in f:
  print line,
f.close()

import smtplib
smtpConn = smtplib.SMTP('stmp.qq.com')
smtpConn.login('username', 'password')
smtpConn.sendmail('fromuser@qq.com', 'touser@qq.com',\
    '''
    some long text
    ''')
smtpConn.quit()

from datetime import date
now = date.today()
time1 = date(2016, 8, 15)
print now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")

range1 = now - time1
print range1.days

import zlib
s = b'witch which has which witches wrist watch'
t = zlib.compress(s)
zlib.decompress(t)

import locale
locale.setlocale(locale.LC_ALL, locale='zh_CN.UTF-8')
locale.getlocale()
locale.getdefaultlocale()

import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')

练手

使用编程语言完成一个简单的任务是学习某个语言最快捷的办法,于是我想了一个简单任务:通过抓取页面自动从ishadowsocks.com上得到一个shadowsocks服务器的连接信息,并更新本机shadowsocks-libev服务的配置文件,再自动重启shadowsocks-libev服务。如果再配合cron定时执行脚本,基本可以做到免费的翻墙方案。源代码如下:

#!/usr/bin/env python
# coding: utf-8

import urllib
import re
from lxml import etree
import json
import os

# 请求www.ishadowsocks.org服务器, 获取shadowsocks服务器信息
content = ''
f = None
try:
    f = urllib.urlopen('http://www.ishadowsocks.org/')
    content = f.read()
finally:
    if f is not None:
        f.close()

tree = etree.HTML(content)
nodes = tree.xpath('//*[@id="free"]/div/div[2]/div[3]/h4')
addr = ''
port = 0
pwd = ''
method = ''
for node in nodes:
    txt = node.text
    if type(txt) is unicode:
        utf8str = txt.encode('utf-8')
        ret = re.findall(r'^.*服务器地址:(.*)$', utf8str)
        if len(ret) > 0:
            addr = ret[0]
        ret = re.findall(r'^端口:(.*)$', utf8str)
        if len(ret) > 0:
            port = int(ret[0])
        ret = re.findall(r'^.*密码:(.*)$', utf8str)
        if len(ret) > 0:
            pwd = ret[0]
        ret = re.findall(r'^加密方式:(.*)$', utf8str)
        if len(ret) > 0:
            method = ret[0].lower()

# 生成shadowsocks-libev配置文件
config = {
    "server": addr,
    "server_port": port,
    "local_port": 1080,
    "password": pwd,
    "timeout": 600,
    "method": method
}

configstr = json.dumps(config, indent=2)

with open('/tmp/shadowsocks-libev.json', 'w') as f:
    f.write(configstr)
    f.write('\n')

# 重启shadowsocks-libev服务
os.system('launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist')
os.system('launchctl load ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist')

下一步计划

在kindle上买了本python cookbook,下一步计划把这本书先看完。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小程序服务商

附近的小程序怎么开通 开发使用小程序需要域名空间服务器吗

1、附近小程序优先展示在最上面,在微信搜索的时候也会优先展示附近的小程序,这能提供不小的流量。

53800
来自专栏云计算D1net

如何有效地同多个云提供商合作

在同多个云提供商合作之前,请评估他们在计算、存储和安全等方面的服务。 企业必须在多个云供应商中做出抉择。亚马逊网络服务是行业巨头,而微软Azure则提供了一整套...

355100
来自专栏Java架构

阿里java架构师:微服务写的最全的一篇文章

今年有人提出了2018年微服务将疯狂至死,可见微服务的争论从未停止过。在这我将自己对微服务的理解整理了一下,希望对大家有所帮助。

2.1K30
来自专栏企鹅号快讯

云数据-欲练神功必先写文档

创建云上的数据恢复计划,很重要的一点是持续跟踪基础架构,DR需求和可能的故障转移持续时间。公有云给IT部门提供了绝佳的机会来实现业务的持续性/灾难恢复计划,而无...

22170
来自专栏Android群英传

IM开源示例——Seatalk

44730
来自专栏互联网研发闲思录

对于最近线上服务以及京东等大型互联网公司对java工程师要求的一些思考

        当下线上服务为了减少上线,经常搞成配置化,配置化对于版本以及持续集成本身是很大破坏,对于此,我个人持保留态度, 是反对过多东西进行配置化,其实配...

36780
来自专栏携程技术中心

干货 | 基于图像比对技术,低成本维护的携程机票前端测试平台SnapDiff

15020
来自专栏BestSDK

好的产品诞生全过程:每个环节都细致入微

当我们提到一些常见的功能时,可以一笔带过,简单的描述一下就可以了,比如:对于微信登录,手机号注册。 那如果我们提到的是一些比较复杂的,具备一定创造性功能的时候,...

30850
来自专栏企鹅号快讯

值得关注的5个Python开源项目

Python领域优秀的开源软件层出不穷。关注一个好的开源软件,对一个开发者来说可以带来很多益处。或者你可以很好地运用这个开源软件,成为它的一个用户;或者你可以阅...

54970
来自专栏社区的朋友们

是的,腾讯投票已经拥抱腾讯云了

小程序腾讯投票最近迁移到腾讯云了,本文记录了为什么做这个迁移,以及前后的工作。

1.5K60

扫码关注云+社区

领取腾讯云代金券