python
2023-06-20 20:50:34 0 举报
AI智能生成
Python
作者其他创作
大纲/内容
整型
浮点型
字符串
布尔值
数据类型
占位符 替换内容%d 整数%f 浮点数%s 字符串%x 十六进制整数
占位符
字符串和编码
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
list
因为tuple不可变,所以代码更安全。
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改
tuple
list和tuple
if添加一个else语句
elif是else if的缩写
if <条件判断1>: <执行1>elif <条件判断2>: <执行2>elif <条件判断3>: <执行3>else: <执行4>
计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。
条件判断
n = 1while n <= 100: print(n) n = n + 1print('END')
循环
Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
dict
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
set
dict和set
python基础
绝对值的函数abs
max函数
>>> int('123')123>>> int(12.34)12>>> float('12.34')12.34>>> str(1.23)'1.23'>>> str(100)'100'>>> bool(1)True>>> bool('')False
数据类型转换
>>> a = abs # 变量a指向abs函数>>> a(-1) # 所以也可以通过a调用abs函数1
函数名其实就是指向一个函数对象的引用
调用函数
def my_abs(x): if x >= 0: return x else: return -x
子主题
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
if age >= 18: pass
空函数
允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance()实现:
参数检查
返回多个值
定义函数
默认参数必须指向不变对象!
def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum
可变参数
关键字参数
命名关键字参数
参数组合
函数参数
递归函数
函数
对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。
切片
可以看出,Python的for循环抽象程度要高于C的for循环,因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。
迭代
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
列表生成
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
生成器
我们已经知道,可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。
凡是可作用于for循环的对象都是Iterable类型;凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
迭代器
高级特性
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
map
reduce
Python内建了map()和reduce()函数。
map/reduce
Python内建的filter()函数用于过滤序列。
filter
sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
Python内置的sorted()函数就可以对list进行排序
sorted
高阶函数
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum
函数作为返回值
全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
>>> f1()9>>> f2()9>>> f3()9
注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
def inc(): x = 0 def fn(): # nonlocal x x = x + 1 return x return fnf = inc()print(f()) # 1print(f()) # 2
使用闭包时,对外层变量赋值前,需要先使用nonlocal声明该变量不是当前函数的局部变量。
闭包
返回函数
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
匿名函数
>>> def now():... print('2015-3-25')...>>> f = now>>> f()2015-3-25
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。
装饰器
Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。
简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
偏函数
函数式编程
导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。
import sys
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。
Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。
使用模块
在Python中,安装第三方模块,是通过包管理工具pip完成的。
三方模块
模块
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
类和实例
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。
访问限制
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
继承和多态
当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?
获取对象信息
由于Python是动态语言,根据类创建的实例可以任意绑定属性。
实例属性和类属性
面向对象编程
面向对象高级编程
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1。
import loggingdef foo(s): return 10 / int(s)def bar(s): return foo(s) * 2def main(): try: bar('0') except Exception as e: logging.exception(e)main()print('END')
Python内置的logging模块可以非常容易地记录错误信息
# err_raise.pyclass FooError(ValueError): passdef foo(s): n = int(s) if n==0: raise FooError('invalid value: %s' % s) return 10 / nfoo('0')
抛出错误
单元测试
错误、调式和测试
读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。
for line in f.readlines(): print(line.strip()) # 把末尾的'\'删掉
文件读写
>>> from io import StringIO>>> f = StringIO()>>> f.write('hello')5>>> f.write(' ')1>>> f.write('world!')6>>> print(f.getvalue())hello world!
>>> from io import StringIO>>> f = StringIO('Hello!\Hi!\Goodbye!')>>> while True:... s = f.readline()... if s == '':... break... print(s.strip())...Hello!Hi!Goodbye!
很多时候,数据读写不一定是文件,也可以在内存中读写。
>>> from io import BytesIO>>> f = BytesIO()>>> f.write('中文'.encode('utf-8'))6>>> print(f.getvalue())b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'
>>> from io import BytesIO>>> f = BytesIO(b'\\xe4\\xb8\\xad\\xe6\\x96\\x87')>>> f.read()b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
StringIO和BytesIO
如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。
>>> import os>>> os.name # 操作系统类型
操作文件
IO编程
进程和线程
常用内建模块
第三方模块
python
0 条评论
回复 删除
下一页