Python基础笔记

丶灬走出姿态 提交于 2019-12-09 20:59:50

生命苦短,我用 python

Python是一种功能强大的语言,有着功能丰富的第三方包,推崇功能齐全的理念,被广泛用于多种场景下。

*nix系统默认的已经内置了一个python,可通过 python -V 检测:

python文件类型分3种,均可直接执行

  1. 源码 .py, 唯一可编辑的代码类型
  2. 字节码 .pyc,源码编译获得
# 通过python脚本来编译一个源码文件
import py_compile
py_compile.compile('hello.py')
  1. 优化代码 .pyo,源码优化获得
# python解释器输出优化代码
python -O -m py_complie hello.py

python程序分package、module、function三个层次

  • 包即目录,由__init__.py文件(必选) 和 多个模块文件组成
  • 模块即py文件,其中可包含:代码、函数、类,

python语法示例

第一行注释(组织行)用于指定解释器,第二行注释用于指定编码从而中文支持

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys

help('类名') #模块均可通过help函数帮助文档

## 控制语句,python没有switch ##
input1 = int(input('请键入数字'))
if input1 == 1:
	print 'a';
elif input1 == 2:
	print 'b';
else
	del input1 #删除变量

while int(input('请输入小于4的数字')) < 4:
	print 'OK';
else:
	print '输入错误';

for x in range(0, 24 , 1):
	print x

## 字符串 ##
str1 = 'hello world'
str1.startswith('hello')
'hello' in str1
str1.find('hello')

## python的三种序列类型 ##
list1 = ['student', 'teacher'] # list列表,可变类型,传统意义的数组
tuple1 = ('student', 'teacher') #tuple元组,不可变类型,单个元素的元组必须跟一个逗号以区分
dict1 = {'role1':'student', 'role2':'teacher'} # 字典,键值对

#列表操作
','.join(list1)
list2 = list1[:] #一份全量拷贝,非refer
list1.append('xxx')
#元组操作
print '%s and %s' % tuple1 #格式化输出
#字典操作
for role, title in dict1.items():
	print 'xxx'
if 'role1' in dict1:
	print 'xxx'
if dict1.has_key('role1'):
	print 'xxx'

## 生成器Generator ##
* 将迭代数据转为数据算法:每次迭代,临时挂起循环,弹出一个值立即进入使用,使用结束继续下一次迭代
* 生成器使用循环来使用其数据,`for`循环内部通过`next()`方法机制获得生成器中下一个值
* 创建Generator:
    - 简单Generator基于列表生成式改造: var1 = (x * x for x in range(100))
    - 复杂Generator可用`yield` 关键字函数

## 函数 ##
# 函数不明确指定,则默认 `return None`
# 可以从函数的第一行开始定义docstring文档字符串,多行字符串形式,首行大写字母开始句号结尾,第二行空行,第三行描述,通过 `__doc__` 来调用docstring
def welcome(name, from, to='usa'):
	print 'welcome ', name, ' from ', from, ' to ', to;
welcome(name='tom', from='china') #关键参数式调用

# *前缀多余函数参数会作为元组存储在args; **前缀多余函数参数会作为字典存储在args
def powersum(arg1, *args):
	print args;

## 模块 ##
#import导入的对象将从`sys.path`中搜索相应的`.py`模块,并运行其主块的语句
import 模块  #单一的导入模块, 可读性好,同时没有名字冲突
from 模块 import 符号表  # 这种导入形式是不推荐

import sys 
sys.argv #命令行参数列表,第一个元素为脚本名称,其后元素为传入参数
sys.path #模块的搜索路径列表(同PYTHONPATH环境变量),第一个空字符串元素代表当前目录

#__name__常量能获得当前模块名,当模块被直接python解释执行而非导入时,模块名设为 '__main__'
if __name__ == '__main__': 
	print 'current is in main module'
dir('sys') #dir函数返回sys模块的符号表,不指定模块则返回当前模块的信息

# 注意事项
* 模块私有变量和函数约定加_、 __ 下划线前缀
* 模块搜索路径(sys.path变量):当前目录、内置模块、第三方模块
* 增加模块搜索路径
    -  `sys.path.append(xxx)`
    - 修改`PYTHONPATH`环境变量

## 面向对象 ##
#对象所有成员都是公共的
# 特例:__打头的变量是实际私有的,_打头的变量是惯例上认为的私有
class Foo
	count = 1 #类变量
	def __init__(self, name):
		self.name = name #对象变量
	def welcome(self, name):
		print 'hi, ' + name
#继承
class Foomore(Foo)
	def say(self, words)
		print words
foomore = Foomore('Tom')
foomore.welcome()
	
## 文件处理 ##
file1 = file('test.dat', 'w')
file1.write('xxxx')
while True:
	line = fiel1.readline()
	if len(line) == 0: break; #当行语句
file1.close()

## 异常 ##
import sys
try:
    s = input('请输入')
except EOFError, e:
	print '程序退出'
    sys.exit()
except:
    print '程序有异常'
    
## 列表综合 ##
listone = [2, 3, 4]
listtwo = [2*i for i in listone if i > 2] #listone中所有大于2的数都是原来的2倍的列表

## lambda ##
#lambda语句用来创建新的函数对象
def make_repeater(n):
    return lambda s: s*n #lambda需要一个参数,后面仅跟单个表达式作为函数体
twice = make_repeater(2)
print twice('word') #word作为s参数传入lambda
注意事项
  • 变量与简单标量值是copy关系,每次copy都将创建新的变量,即便变量名相同,可以通过 id() 函数获取变量标识来验证
  • 变量与复杂对象间是refer关系,copy必须通过切片来进行
  • 任何类型都是对象,可通过 type 类来查看具体类型
  • 不支持自增自减
  • 大小写敏感
  • 可以使用分号在一个物理行上划分多个逻辑行,但不建议
  • 可通过行末反斜杠\来续行
  • 全局变量需要global声明,global a, b, c
字符串要点
  • 字符串可以通过单引号、双引号来标识,多行字符串通过三引号(‘’‘...’‘’)标识
  • r或R前缀可以标识字符串为不转义的自然字符串
  • 相邻字符串会被自动拼接
Unicode编码
  • utf-8存储 -> Unicode加载到内存 -> 数据展现
  • u或U前缀来标识Unicode字符串,u'中'和u'\u4e2d'表示了同一个数据
  • utf-8标准:汉子一般为三个字节,生僻字可能为4~6个字节
  • unicode转utf-8:u'中文'.encode('utf-8') => '\xe4\xb8\xad\xe6\x96\x87'

PDB调试

程序加断点

import pdb

pdb.set_trace()

调试命令

l  # 查看周围代码
n  # 单步执行
p  # 打印变量
c  # 继续执行
q  # 退出

sublime下python提示插件推荐用Anaconda

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!