Python基础02 条件、循环及其他语句
描述
Python是一种面向对象的解释性高级编程语言。print、import语句、赋值语句、条件语句和循环语句等都是包含对象的表达式。
1、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()
笔记:
1、print打印多个表达式,不同表达式之间用逗号分隔,则是默认分隔符为空格。如果需要,可以通过属性 sep='_' 自定义分隔符。
2、不同表达式通过 + 连接之后的打印结果将没有空格作为分隔符。
3、print默认结束字符串为换行符。如果需要,可以通过属性 end=‘ ’ 自定义空字符串为结束字符串。
2、import语句
执行import语句,可以导入整个模块,也可以导入模块中的特定对象。
# 导入math整个模块 # import 模块1 import math math.sqrt(10) # from 模块1 import *,不建议使用! from math import * sqrt(10) #导入math模块里面的sqrt from math import sqrt
笔记:
1、两个不同的模块可能包含有相同名称的对象(全局变量和函数)。当这些模块被同时导入到一个模块中时,需要给其中一个模块的对象赋予一个别名。Python解释器是从上往下逐行执行代码。如果不使用别名,Python解释器执行该函数或其他指令时,将调用的是程序中最后一个模块中的对象。
from somemodule import somefunction as ...
2、有些模块组成层次结构,即一个模快位于另一个模块中。
3、赋值语句
1、序列解包(可迭代对象解包):
将可迭代对象解包,并将得到的值存储到一系列变量。可迭代的对象包括列表,元组,字典和字符串,与索引或者键获取可迭代对象的元素依次赋值给多个变量,序列解包并行给多个变量赋值。
num1, num2, *rest_num = [1, 2, 3, 4, 5] print(num1, num2, rest_num) a, *b, c = 'abc' print(a, b, c)
笔记:
1、* 运算符可以收集多余的值,但是带 * 的变量最终包含的总是一个列表。
2、链式赋值
将多个变量关联到同一个值。
import math x = y = math.sqrt(10) # 以上代码与以下代码等价 y = math.sqrt(10) x = y # 上面两个代码与以下代码不等价 y = math.sqrt(10) x = math.sqrt(10)
3、增强赋值
增强赋值适用于所有的标准运算符,如 *、+、-、%、//、/等,增强赋值也适用于其他数据类型:foo *= 2
4、代码块(一组语句)
代码块是一组语句。代码块是通过缩进代码(增加空格)来创建的。缩进代码块可以通过制表符,Python当中制表符解释为移到下一个制表位。(相邻制表位间隔8个空格符),但是标准的Python代码缩进是使用4个空格缩进代码。
Python语言当中冒号:指出接下来的一组语句是代码块,并将代码块中的每一行代码缩进相同程度。
5、条件语句
1、判断-布尔值、比较运算符、布尔运算符
1、真值也称为布尔值。标准值:False,None,、各种数据类型:‘ ’,0,[],(),{} 都会被解释器视为假,而其他值都被视为真(包括 Ture)。
2、类型 bool 可以装换其他值为布尔值,在Python解释器中值会被自动转换。
3、对象相同可以使用比较运算符:is;对象相等可以使用比较运算符:==。is比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同),==是值比较。不可变对象,例如int,str,它会直接进行值比较。对于Python已知的对象,会调用他们的__eq__函数来比较。
4、对象缓存机制,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])
5、字符串和序列的比较,字符串的比较是利用函数 ord ,按照字符串中字符排列顺序依次获取字符在ASCII码表中的顺序值并进行比较。序列的比较方式与字符串比较方式相似,但是序列包含的元素可能不是字符,其他类型的元素如元组和列表等,也是根据同样的规则对元素进行比较。
6、布尔运算符: and、 or、 not ,只做必要计算。如果使用布尔运算符,要注意表达式的先后顺序,。如 表达式1 and 表达式2 ,只有表达式1为真才会执行表达式2,如果表达式1为假,立刻返回假,而不会关心表达式2。
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() 函数是对象迭代器,把对象转为一个列表,返回的变量类型为列表。
6、断言语句 assert
断言语句,提醒核查程序是否满足预先设定的要求。逻辑解释:if not codition:crash progam
num = input('give a number: ') assert 0 < num < 100, 'the number needs to be realistic'
7、条件语句 for 循环
在条件为真时,反复执行代码块。python时面向对象的语言,也就是条件为真时,对象可以反复执行代码块,所以可进行 for 循环的对象都是可迭代的对象。可执行r 循环语句的对象肯定是可迭代对象,但是可迭代对象不一定就能执行 for 循环语句。
1、迭代字典
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)
笔记:
1、方法:d.items、d.keys、d.values 返回值的数据类型是字典视图,字典视图只能确定其长度(函数 len )和执行成员检查( in )。
2、字典元素的排列顺序是不确定的。如果需要按照特定的顺序迭代字典的键或者值,需要将键或者值放在列表中,对列表进行排序,然后以列表中的元素即键或者值进行迭代。
3、模块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
4、迭代工具---模块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将可迭代的对象输出为字符串或者列表,但是该序列却不能执行索引或者切片操作,也不能调用列表方法。
8、循环中间运行,特殊作用的语句
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: ')))
9、列表推导
列表是从其他列表创建列表的方式。列表推导里面元素的循环语句可以嵌套。
x = [x for x in range(1, 10, 2)] print(x)
笔记:
1、列表推导是代码更改整洁
2、字典的使用可以使代码运算效率更高,因为字典可以减少检查的可能性。