遍历python语法
2.基本元素:数字、字符串和变量
2.1 python有哪些基本类型?
布尔型(True, False),整型(42,100000),浮点型(3.14159,1.0e8),字符串型("string")
2.2 python中所有的数据都是以对象的形式存在。
对象就是数据实体,变量就是名字。对象有类型之分,基本的就以上几种,对象还分常量和变量。
2.3 变量赋值(=)?
赋值不等于复制,变量赋值只是为数据对象取了一个名字,名字是对对象的引用而不是对象本身。
变量名是与实际数据相关联的名字,变量存在的意义就是为了让人方便引用内存中的值,在编译时变量名会被替换为地址。
2.4 如何查看对象的类型?type()语句
2.5 python数字(整数和浮点数)运算?
+、-、*、/(浮点除)、//(整数除)、%(求余)、**(幂)、divmod()
2.6 python中的基数
0b/0B二进制、0o/0O八进制、0x/0X十六进制
2.7 类型转换、长度查看(均为内置函数,不依附于对象,可以直接使用)
int(), float(), str(), bool();len()
2.8 python3从python2中分离出来的原因?
Unicode
2.9 字符串型?
第一个序列类型,本质是字符序列,不可变(同元组,不能直接插入、删除和更改元素)。
2.10 创建字符串?
单引号或双引号创建(交互式解释器输出的字符串永远是单引号包裹的),三连(单双)引号创建多行字符串。
2.11 print函数的输出格式
print会截取最外层的引号,直接输出实际内容;自动在各输出部分之间添加空格;所有输出最后添加换行符。(print输出格式可以设置)
2.12 字符串操作:拼接、复制、提取、单个字符替换
“+”拼接字符串常量和变量;直接先后放置可以拼接字符串常量;“*”可以做字符串乘法,做复制;“[]”可以通过偏移量提取字符,可以从头[0][1][2]提取,也可以从尾部[-1][-2]提取(不能超过最大限制)。“obj.replace('obj', 'c')”可用于替换字符串的单个字符。
2.13 分片操作[start:end:step]
[:]提取整个字符串;[start:]从start到结尾;[:end]从开头到end-1(特别注意);[start:end]从start到end-1;[start:end:step]从start到end-1,每step个字符提取一个。
偏移量0是开头;-1是结尾;step为负就是逆序。
2.14 字符串对象的成员函数:split(),join(),
string.split("string" or 'c')将字符串按分隔符分割为子串的列表[]。
("string" or 'c').join(list)反向操作
string.startwith("string"); string.endwith("string"); string.find("string"); string.rfind("string"); string.count("string"); string.isalnum().
string.strip("."); string.capitalize(); string.title(); string.upper(); string.lower(); string.swapcase(); string.center(30); string.ljust(30); string.rjust(30).
2.15 字符串子串替换:replace()
string.replace("obj", "c", num)函数有三个参数,第三个为最多替换多少处。功能不如正则表达式强大。
3.容器:列表、元组、字典与集合
将数据进行拆分和合并,加工为特定形式。
3.1 序列结构 字符串、元组、列表(前两者不可变)(后两者不要求所含元素种类相同)
3.2 创建列表 [] list[] 列表推导式 (列表有序,元素可重复)
3.3 数据结构之间的转换 list(), tuple(), dict(), set()
list()可以将字符串、元组转化为列表,split()可以将字符串分割为列表,join可以将列表形成字符串
3.4 使用[下标]获取列表元素,[0][1][2], [-1][-2][-3];
3.5 列表里面可以包含任意元素,所以列表可以嵌套列表,[[],[],[]],一般嵌套两层就足够了,类似二维数组。
3.6 切片提取元素:[start, end, step]
3.7 列表对象的成员函数:list.append(var)(在末尾添加元素), list.extend(var)(+=)(合并列表), list.insert(num, var)(在指定位置插入元素), list.remove(value)(删除指定值元素), list.pop(1)(获取并删除指定位置元素,其中pop()==pop(-1)), list.index(value)(查询特定值元素的位置), list.count(value)(计算列表中指定值出现的次数), list.sort(reverse=True)(排序列表,列表会改变,可设定排序方向),
3.8 python语句操作列表:del语句,del list[num]; in语句(判断值是否在列表中),
3.9 python函数:sorted()排序;len()获取长度;=(赋值);copy()(复制);(赋值才不会偶联,复制有多种方法,list(),切片)
3.10 创建元组:()创建空元组;元组是以逗号创建并标记的,逗号不能省,括号可以;
3.11 可以将元组赋值给多个变量,进行元组解包;
3.12 创建字典:{}创建空字典;添加元素;
3.13 dict()可以将任意双值子序列转化为字典(嵌套);dict.clear()删除所有元素;dict.get(key, return);dict.keys()获取所有键;dict.values()获取所有值;dict.items()获取所有键值对;dict.copy()复制;
3.14 字典成员函数:dict.update(dict)合并字典;
3.15 del删除指定键的元素;in判断键是否存在;
3.16 创建集合:set()创建空集;{1,2,3}创建集合;
3.17 集合运算:交集&;并集|;差集-;异或集^;<=判断是否子集;>=判断是否超级;>判断是否真超集;
3.18 总结:[]创建列表;逗号创建元组;{}创建字典;注意:由于字典的特性,列表、字典、集合都不能作为字典的键;元组可以;还有不可变的常量。
4.Python外壳:代码结构
Python不使用()、{}来划分代码;而是使用:和代码缩进(缩进决定如何配对)来划分代码。
4.1 使用连接一行代码
4.2 选择结构:if elif else
if exp:
if exp:
elif exp:
else:
else:
statement
4.3 python可以直接使用比较符号比较字符串,而perl不行。
4.4 布尔操作符and, or, not;
4.5 循环结构:while for
count = 1
while count <= 5:
print(count)
count+=1
for的牛逼之处在于:在数据结构长度未知,具体实现未知的情况下遍历整个数据结构,核心是in。
for rabbit in rabbits:
print(rabbit)
对字典的迭代可能需要用到keys(), values(), items()等成员函数。
4.6 python很奇葩,貌似没有自增自减运算符++、—。
4.7 控制循环:break continue
4.8 循环外的else,循环正常结束(从头到尾),没有使用break中断。
4.9 并行迭代:zip(), 正常for in只能对单个数据结构,而zip()则可以同时迭代多对数据结构。zip()也不局限于for中,它可以迭代任何成组数据结构。
4.10 range()生成自然数序列:
range(start, end, step)
zip()、range()返回的都是可迭代对象,可以用于for in遍历,但是要称为数据实体就必须使用list()、tuple()、set()、dict()转化。
4.11 推导式
看似复杂,其实很简单,[]里,前面是表达式,后面是迭代变量,使用for和if确定迭代变量的值。
列表推导式:
a = [str(b)*3 for b in range(1,6) if b % 2 == 0]
cells = [(a, b) for a in list1 for b in list2 if ...]
字典推导式:
counts = {letter:word.count(letter) for letter in word}
集合推导式
a_set = {num for num in range(1,6) if num % 3 == 1}
生成器推导式(元组),返回一个生成器对象,只能运行一次。
num_thing = (num for num in range(1,6))
4.12 函数
4.12.1 创建函数的基本格式:
def func1():
exp
return var
4.12.2 python函数参数的传递:位置参数、关键字参数、默认参数
位置参数(*):就是C里面最原始的参数传递形式,按顺序传递,必须弄清定义函数的每个位置参数的意义。
关键字参数(**):就是强行指定传递参数,优先级比位置参数低,一般是不记得函数后面几个参数,就强行指定。
默认参数:是在函数定义时,给函数参数定义的默认值。缺省参数。若调用时提供了参数就会覆盖。
4.12.3 传递可变数量的参数(*)(**)
(*)将一组可变数量的位置参数集合成参数值的元组。
(**)将参数收集到一个字典里
4.12.4 文档字符串 函数开始的一段说明和帮助的字符串
4.13 函数的参数可以是任意的对象,也可以是函数,调用方式是一样的。
4.14 内部函数 在函数的内部定义另外一个函数,目的是避免函数内部的重复。
4.15 匿名函数:lambda()
lambda()是用一个语句表达的匿名函数,目的是用来代替小型函数,临时用一次。
edit_story(stairs, lambda word: word.capitalize() + '!')
lambda函数接受一个参数word,冒号后为函数的定义。
4.16 生成器(就是前面的元组的推导式)
为了迭代庞大的数据结构,而不需要创建序列实体,当序列比较大时通常会创建一个生成器函数。(此时不用return,而是用yield)
def my_range(first=0, last=10, step=1):
number = first
while number < last:
yield number
number += step
此函数返回一个生成器对象,可用于for迭代。
4.17 装饰器
在不改变源代码的情况下修改已经存在的函数;
装饰器就是一个函数,以一个函数为输入,并返回另一个函数。
结合:*arg和**kwargs;闭包;函数作为参数
def document_it(func):
def new_function(*args, **kwargs):
print("Running function:", func.__name__)
print("Positional arguments:", args)
print("Keyword argument:", kwargs)
result = func(*args, **kwargs)
print("Result:", result)
return result
return new_function
装饰器,顾名思义,就是装饰一下已有的函数,返回新的函数。
也可以在定义函数前,添加装饰器的名字,如@document_it,之后定义的函数就会默认使用装饰器。
可以有多个装饰器,靠近函数的装饰器会优先执行。
4.18 命名空间和作用域
4.18.1 怎么查看每个对象的唯一ID值? id()语句
4.18.2 怎么在函数内部读取全局变量? global关键字
4.18.3 怎么获取命名空间的内容?
locals()返回局部命名空间内容的字典
globals()返回全局命名空间内容的字典
4.18.4 两个下划线__的是什么?
在函数内部,func.__name__就是该函数的名称;func.__doc__是文档字符串。
主程序的名字就是__main__.
4.19 异常,try和except处理错误
>>> short_list = [1,2,3]
>>> position = 5
>>> try:
short_list[position]
except:
print('Need a psotion between 0 and', len(short_list)-1, 'but got', position)
解释:在try中的代码会被执行,如果存在错误,就抛出异常,然后执行except中的代码;否则跳过except代码块。
except exceptiontype as name获取整个异常对象
4.20 自定义异常
需要自定义异常类,可以继承已有的异常类;
使用时,就raise My_Exception(var)就可以了;
补充:None只能用is语句来识别。