描述python
Python是一种面向对象的解释性高级编程语言。print、import语句、赋值语句、条件语句和循环语句等都是包含对象的表达式。编程
一、print缓存
print能够打印一个表达式或者多个用逗号分隔开的表达式。表达式式要么是字符串,要么就被自动转换为字符串。数据结构
print目前实际上是一个函数:编程语言
print(dir(print()))
print函数返回值是 NoneType?执行如下代码均会出现 error.函数
list(print('age', 2)) # TypeError: 'NoneType' object is not iterable len(print('age', 2)) # TypeError: object of type 'NoneType' has no len()
笔记:工具
一、print打印多个表达式,不一样表达式之间用逗号分隔,则是默认分隔符为空格。若是须要,能够经过属性 sep='_' 自定义分隔符。ui
二、不一样表达式经过 + 链接以后的打印结果将没有空格做为分隔符。spa
三、print默认结束字符串为换行符。若是须要,能够经过属性 end=‘ ’ 自定义空字符串为结束字符串。rest
二、import语句
执行import语句,能够导入整个模块,也能够导入模块中的特定对象。
# 导入math整个模块 # import 模块1 import math math.sqrt(10) # from 模块1 import *,不建议使用! from math import * sqrt(10) #导入math模块里面的sqrt from math import sqrt
笔记:
一、两个不一样的模块可能包含有相同名称的对象(全局变量和函数)。当这些模块被同时导入到一个模块中时,须要给其中一个模块的对象赋予一个别名。Python解释器是从上往下逐行执行代码。若是不使用别名,Python解释器执行该函数或其余指令时,将调用的是程序中最后一个模块中的对象。
from somemodule import somefunction as ...
二、有些模块组成层次结构,即一个模快位于另外一个模块中。
三、赋值语句
一、序列解包(可迭代对象解包):
将可迭代对象解包,并将获得的值存储到一系列变量。可迭代的对象包括列表,元组,字典和字符串,与索引或者键获取可迭代对象的元素依次赋值给多个变量,序列解包并行给多个变量赋值。
num1, num2, *rest_num = [1, 2, 3, 4, 5] print(num1, num2, rest_num) a, *b, c = 'abc' print(a, b, c)
笔记:
一、* 运算符能够收集多余的值,可是带 * 的变量最终包含的老是一个列表。
二、链式赋值
将多个变量关联到同一个值。
import math x = y = math.sqrt(10) # 以上代码与如下代码等价 y = math.sqrt(10) x = y # 上面两个代码与如下代码不等价 y = math.sqrt(10) x = math.sqrt(10)
三、加强赋值
加强赋值适用于全部的标准运算符,如 *、+、-、%、//、/等,加强赋值也适用于其余数据类型:foo *= 2
四、代码块(一组语句)
代码块是一组语句。代码块是经过缩进代码(增长空格)来建立的。缩进代码块能够经过制表符,Python当中制表符解释为移到下一个制表位。(相邻制表位间隔8个空格符),可是标准的Python代码缩进是使用4个空格缩进代码。
Python语言当中冒号:指出接下来的一组语句是代码块,并将代码块中的每一行代码缩进相同程度。
五、条件语句
一、判断-布尔值、比较运算符、布尔运算符
一、真值也称为布尔值。标准值:False,None,、各类数据类型:‘ ’,0,[],(),{} 都会被解释器视为假,而其余值都被视为真(包括 Ture)。
二、类型 bool 能够装换其余值为布尔值,在Python解释器中值会被自动转换。
三、对象相同可使用比较运算符:is;对象相等可使用比较运算符:==。is比较的是二者是不是同一个对象,因此比较的是内存地址(id是否相同),==是值比较。不可变对象,例如int,str,它会直接进行值比较。对于Python已知的对象,会调用他们的__eq__函数来比较。
四、对象缓存机制,Python会对比较小的对象缓存,下次用到比较小的对象(数,字符串)时,会去缓存区查找,若是找到,不会再开辟新的内存,而是继续把小对象的地址赋给新的值。
""" x = 1 y = 1 print(x is y) print(id(x)) print(id(y)) """ z = [1, 2] y = [1, 2] print(z is y) print(z is [1, 2])
五、字符串和序列的比较,字符串的比较是利用函数 ord ,按照字符串中字符排列顺序依次获取字符在ASCII码表中的顺序值并进行比较。序列的比较方式与字符串比较方式类似,可是序列包含的元素可能不是字符,其余类型的元素如元组和列表等,也是根据一样的规则对元素进行比较。
六、布尔运算符: and、 or、 not ,只作必要计算。若是使用布尔运算符,要注意表达式的前后顺序,。如 表达式1 and 表达式2 ,只有表达式1为真才会执行表达式2,若是表达式1为假,马上返回假,而不会关心表达式2。
二、条件语句: if、elif、else
students_age =[15,16,12,14,17,12,10]; for age in students_age: if age == 10: print("current student's age is :" + str(age)); elif age == 12: print("the age of " + str(age) + " has two students"); else: print("age is older then 12");
笔记:
可迭代对象和迭代器,任何实现了__iter__
和__next__()
方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值。range()函数返回的是一个可迭代对象,list() 函数是对象迭代器,把对象转为一个列表,返回的变量类型为列表。
六、断言语句 assert
断言语句,提醒核查程序是否知足预先设定的要求。逻辑解释:if not codition:crash progam
num = input('give a number: ') assert 0 < num < 100, 'the number needs to be realistic'
七、条件语句 for 循环
在条件为真时,反复执行代码块。python时面向对象的语言,也就是条件为真时,对象能够反复执行代码块,因此可进行 for 循环的对象都是可迭代的对象。可执行r 循环语句的对象确定是可迭代对象,可是可迭代对象不必定就能执行 for 循环语句。
一、迭代字典
y = {'a': 'b', (1, 2): 'c', 42: 'age'} for key in y: z = y.values() x = list(y.values()) print(key, "corresponds to:", z, x)
笔记:
一、方法:d.items、d.keys、d.values 返回值的数据类型是字典视图,字典视图只能肯定其长度(函数 len )和执行成员检查( in )。
二、字典元素的排列顺序是不肯定的。若是须要按照特定的顺序迭代字典的键或者值,须要将键或者值放在列表中,对列表进行排序,而后以列表中的元素即键或者值进行迭代。
三、模块collections中的OrderdDict类可让映射记住其项的插入顺序。
# 代码来源:https://www.jianshu.com/p/3a49908295ce
In [1]: from collections import OrderedDict In [2]: favorite_language = OrderedDict() In [3]: favorite_language["zhangsan"] = "Enlish" In [4]: favorite_language["lisi"] = "Chinese" In [5]: favorite_language["wangwu"] = "French" In [6]: favorite_language Out[6]: OrderedDict([('zhangsan', 'Enlish'), ('lisi', 'Chinese'), ('wangwu', 'French')]) In [7]: for name, language in favorite_language.items(): ...: print(name +": " + language) ...: zhangsan: Enlish lisi: Chinese wangwu: French In [8]: type(favorite_language) Out[8]: collections.OrderedDict
四、迭代工具---模块itertools、内置函数 zip、
模块itertools
模块里面有一部分函数能够帮助迭代序列。
函数 zip:
函数zip能够将两个序列“缝合”,返回一个由元组组成的序列(序列的元素都有编号,为何不能经过索引获取元组呢???)。返回值是一个适合迭代的对象,可使用list将其转换为列表。
num1 = [1, 2, 3, 4] num2 = ['day1', 'day2', 'day3'] x = zip(num1, num2) print((1, 'day1') in x) y = list(x) print((2, 'day2') in y) print(x) print(y) print(dir(zip()))
笔记:
函数zip和函数reversed返回的是一个能够迭代的神秘对象。该对象能够用于在for语句中使用判断是否包含指定元素,或者调用join、list将可迭代的对象输出为字符串或者列表,可是该序列却不能执行索引或者切片操做,也不能调用列表方法。
八、循环中间运行,特殊做用的语句
break语句:结束(跳出)循环。代码重复一般被视为坏事,while Ture:... ;if...:break技巧能够是一种解决该问题的一种方法。
continue语句:结束当前迭代,并调到下一次迭代开头
pass语句:python中的pass语句什么都不执行,可是能够修复Python问题。
del语句:删除到对象的引用还会删除名称自己,致使该名称未被定义,可是该对象没有被删除。
x = [x for x in range(1, 10, 2)] y = x print(x, y) del x print(y) print(x)
曾为语句但现为函数的 exec 和与其相关的 eval:exec将字符串当成代码执行,因为字符串里面的内容可能会污染代码的命名空间,须要向该函数传递一个字典做为命名空间(scope = {} ,scope里面还包含全部内置函数和值的字典__builtins__)。eval将字符串当成有效的表达式来求值,并返回结果。eval的结果能够是字符,序列和映射等数据结构。不要滥用eval函数:不要直接使用eval直接转换 input 的结果,由于可使用其余模块进行强大的操做。如:input输入的是'__inport__('os').system('touch text')'将可直接操做项目内容,可能危害项目正常运行。
from math import sqrt scope = {} # 能够在该命名空间添加一些值 scope['x'] = 1 exec('sqrt = 4',scope) print(dir(scope)) print(sqrt) print(sqrt(4))
print(eval(16*2))
print(eval('16*2'))
print(eval(input('what: ')))
九、列表推导
列表是从其余列表建立列表的方式。列表推导里面元素的循环语句能够嵌套。
x = [x for x in range(1, 10, 2)] print(x)
笔记:
一、列表推导是代码更改整洁
二、字典的使用可使代码运算效率更高,由于字典能够减小检查的可能性。