文章目录

  • Python教程
  • 值类型和引用类型
  • 列表和字典的基本操作
    • 列表
    • 元组
    • 字典
    • Set
  • 函数
    • 内置函数
    • 定义函数
    • 空函数
    • 参数检查
      • 定义默认参数要牢记一点:默认参数必须指向不变对象!

Python教程

廖雪峰 Python 教程

值类型和引用类型

数据类型

  1. 整数
  2. 浮点数
  3. 字符串
  4. 布尔值(True/False)(and/or/not)
  5. 空值(None)
  6. list/tuple
  7. dict/set
  • 值类型(不可变对象):对象本身不可改变。例如:

      a = "abc"a.replace("a", "A")        # 输出 Abcprint(a)        # 输出 abc
    

    对象本身不可变 意思是当给变量a赋值为abc后,再对变量a执行任何操作都会新分配一块内存来存储操作后得到的值,而字符串本身abc无论怎样都不会改变。

    要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’。

  • 引用类型(可变对象):对象本身可以改变。例如:

      arr = [1, 2, 3, 4, 5]arr[0] = 9print(arr)             # 输出 [9, 2, 3, 4, 5]
    

列表和字典的基本操作

Python内置的一种数据类型是列表:listlist 是一种有序的集合,可以随时添加和删除其中的元素。

列表

classmates=['Michael', 'Bob', 'Tracy']
  • 获取长度:len(classmates)
  • 追加元素到末尾:classmates.append('Adam')
  • 把元素插入到指定位置:classmates.insert(1, 'Jack')
  • 删除末尾元素:classmates.pop()
  • 删除指定位置的元素:classmates.pop(i)

元组

classmates = ('Michael', 'Bob', 'Tracy')

另一种有序列表叫元组:tupletuplelist 非常类似,但是 tuple 一旦初始化就不能修改。

现在,classmates 这个 tuple 不能变了,它也没有 append()insert() 这样的方法。其他获取元素的方法和 list 是一样的,你可以正常地使用 classmates[0]classmates[-1] ,但不能赋值成另外的元素。

tuple 的陷阱:定义一个只有1个元素的 tuple ,如果你这么定义:t = (1) 定义的不是 tuple,是 1 这个数!这是因为括号 () 既可以表示 tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是 1
所以,只有1个元素的 tuple 定义时必须加一个逗号,,来消除歧义:t = (1,)

“可变的” tuplet = ('a', 'b', ['A', 'B'])
tuple 所谓的“不变”是说,tuple 的每个元素,指向永远不变。即指向 a,就不能改成指向 b,指向一个 list ,就不能改成指向其他对象,但指向的这个 list 本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的 tuple 怎么做?那就必须保证tuple 的每一个元素本身也不能变。

字典

d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
  • 判断 key 是否存在:'Thomas' in d
  • 获取指定 keyd.get('Thomas')

如果key不存在,可以返回None,或者自己指定的value:d.get('Thomas', -1)

  • 删除一个 keyd.pop('Bob')
  • 清空字典:d.clear()

请务必注意,dict 内部存放的顺序和 key 放入的顺序是没有关系的。

list 比较,dict 有以下几个特点:

  1. 查找和插入的速度极快,不会随着 key 的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

list 相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict 是用空间来换取时间的一种方法。

dict 可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用 dict 非常重要,需要牢记的第一条就是 dictkey必须是不可变对象

这是因为 dict 根据 key 来计算 value 的存储位置,如果每次计算相同的 key 得出的结果不同,那 dict 内部就完全混乱了。这个通过 key 计算位置的算法称为 哈希算法(Hash)

要保证 hash 的正确性,作为 key 的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为 key 。而 list 是可变的,就不能作为key

Set

setdict 类似,也是一组 key 的集合,但不存储 value 。由于 key 不能重复,所以在 set 中,没有重复的 key

要创建一个 set ,需要提供一个 list 作为输入集合:

>>> s = set([1, 2, 3])
>>> s{1, 2, 3}

注意,传入的参数 [1, 2, 3] 是一个 list ,而显示的 {1, 2, 3} 只是告诉你这个 set 内部有1,2,3这3个元素,显示的顺序也不表示 set 是有序的。

重复元素在 set 中自动被过滤:

>>> s = set([1, 1, 2, 2, 3, 3])
>>> s{1, 2, 3}
  • 添加元素:add(key) 可以重复添加,但不会有效果。
  • 删除元素:remove(key)

set 可以看成数学意义上的无序和无重复元素的集合,因此,两个 set 可以做数学意义上的交集、并集等操作。
setdict 的唯一区别仅在于没有存储对应的 value ,但是,set 的原理和 dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证 set 内部“不会有重复元素”。

函数

内置函数

Python 内置函数

Python 3 学习(二)—— 常用内置函数(网上收集整理)

定义函数

在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。
我们以自定义一个求绝对值的 my_abs 函数为例:

def my_abs(x):if x >= 0:return xelse:return -x

请注意,函数体内部的语句在执行时,一旦执行到 return 时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
如果没有 return 语句,函数执行完毕后也会返回结果,只是结果为 Nonereturn None可以简写为 return

空函数

如果想定义一个什么事也不做的空函数,可以用 pass 语句:

def nop():pass

pass 语句什么都不做,那有什么用?实际上 pass 可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个 pass,让代码能运行起来。
pass 还可以用在其他语句里,比如:

if age >= 18:pass

缺少了 pass,代码运行就会有语法错误。

参数检查

函数的参数:

  1. 位置参数:调用函数的时候传入参数的位置是固定的

     def power(x, n):s = 1while n > 0:n = n - 1s = s * xreturn spower(5, 2)
    
  2. 默认参数

     def power(x, n=2):s = 1while n > 0:n = n - 1s = s * xreturn s
    

    设置默认参数时,有几点要注意:
    一是必选参数在前,默认参数在后,否则Python的解释器会报错(思考一下为 什么默认参数不能放在必选参数前面);
    二是如何设置默认参数。
    当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
    使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

    当不按顺序提供部分默认参数时,需要把参数名写上。

    默认参数很有用,但使用不当,也会掉坑里。默认参数有个最大的坑,演示如下:

     def add_end(L=[]):L.append('END')return L
    

    当你正常调用时,结果似乎不错:

     >>> add_end([1, 2, 3])[1, 2, 3, 'END']>>> add_end(['x', 'y', 'z'])['x', 'y', 'z', 'END']
    

    当你使用默认参数调用时,一开始结果也是对的:

     >>> add_end()['END']
    

    但是,再次调用add_end()时,结果就不对了:

     >>> add_end()['END', 'END']>>> add_end()['END', 'END', 'END']
    

    原因解释如下:
    Python函数在定义的时候,默认参数 L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

    定义默认参数要牢记一点:默认参数必须指向不变对象!

    要修改上面的例子,我们可以用None这个不变对象来实现:

     def add_end(L=None):if L is None:L = []L.append('END')return L
    

    为什么要设计str、None这样的不变对象呢?
    因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。
    此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。

  3. 可变参数:传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。(在参数前面加*

    例子:请计算a2 + b2 + c2 + ……。

     def calc(numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum
    

    但是调用的时候,需要先组装出一个list或tuple:

     >>> calc([1, 2, 3])14>>> calc((1, 3, 5, 7))84
    

    如果利用可变参数,调用函数的方式可以简化成这样:

     >>> calc(1, 2, 3)14>>> calc(1, 3, 5, 7)84
    

    定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:

     def calc(*numbers):sum = 0for n in numbers:sum = sum + n * nreturn sum>>> calc(1, 2)5>>> calc()0
    

    如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:

     >>> nums = [1, 2, 3]>>> calc(nums[0], nums[1], nums[2])14
    

    这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:

     >>> nums = [1, 2, 3]>>> calc(*nums)14
    

    *nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。

  4. 关键字参数

    可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:

     def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)
    

    函数person除了必选参数nameage外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:

     >>> person('Michael', 30)name: Michael age: 30 other: {}
    

    也可以传入任意个数的关键字参数:

     >>> person('Bob', 35, city='Beijing')name: Bob age: 35 other: {'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
    
  5. 命名关键字参数

    对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过 kw 检查。

    仍以 person() 函数为例,我们希望检查是否有 cityjob 参数:

     def person(name, age, **kw):if 'city' in kw:# 有city参数passif 'job' in kw:# 有job参数passprint('name:', name, 'age:', age, 'other:', kw)
    

    但是调用者仍可以传入不受限制的关键字参数:

     >>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)
    
    1. 如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收 cityjob 作为关键字参数。这种方式定义的函数如下:
     def person(name, age, *, city, job):print(name, age, city, job)
    

    和关键字参数 **kw 不同,命名关键字参数需要一个特殊分隔符 ** 后面的参数被视为命名关键字参数。调用方式如下:

     >>> person('Jack', 24, city='Beijing', job='Engineer')Jack 24 Beijing Engineer
    
    1. 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符 * 了:
     def person(name, age, *args, city, job):print(name, age, args, city, job)
    

    命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

     >>> person('Jack', 24, 'Beijing', 'Engineer')Traceback (most recent call last):File "<stdin>", line 1, in <module>TypeError: person() takes 2 positional arguments but 4 were given
    

    由于调用时缺少参数名 cityjob ,Python解释器把这4个参数均视为位置参数,但 person() 函数仅接受2个位置参数。

    命名关键字参数可以有缺省值,从而简化调用:

     def person(name, age, *, city='Beijing', job):print(name, age, city, job)
    

    由于命名关键字参数 city 具有默认值,调用时,可不传入 city 参数:

     >>> person('Jack', 24, job='Engineer')Jack 24 Beijing Engineer
    

    使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个 * 作为特殊分隔符。如果缺少 * ,Python解释器将无法识别位置参数和命名关键字参数:

     def person(name, age, city, job):# 缺少 *,city和job被视为位置参数pass
    
  6. 参数组合

    在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:

    • 必选参数
    • 默认参数
    • 可变参数
    • 命名关键字参数
    • 关键字参数

    比如定义一个函数,包含上述若干种参数:

     def f1(a, b, c=0, *args, **kw):print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)def f2(a, b, c=0, *, d, **kw):print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
    

    在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。

     >>> f1(1, 2)a = 1 b = 2 c = 0 args = () kw = {}>>> f1(1, 2, c=3)a = 1 b = 2 c = 3 args = () kw = {}>>> f1(1, 2, 3, 'a', 'b')a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}>>> f1(1, 2, 3, 'a', 'b', x=99)a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}>>> f2(1, 2, d=99, ext=None)a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
    

    最神奇的是通过一个tuple和dict,你也可以调用上述函数:

     >>> args = (1, 2, 3, 4)>>> kw = {'d': 99, 'x': '#'}>>> f1(*args, **kw)a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}>>> args = (1, 2, 3)>>> kw = {'d': 88, 'x': '#'}>>> f2(*args, **kw)a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
    

    所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

Python 3 学习(一)—— 基础:廖雪峰 Python 教程学习笔记相关推荐

  1. python零基础入门教程学习要多久-廖雪峰python教程要学多久-零基础学Python需要多久...

    零基础学python大约需要多久 看不同的人,不同的学习能和基础. 像我通java,vc ,javascript,groovy,vb,c 接触过c#,delphi,asp,E语言, 用过dreamwa ...

  2. 廖雪峰Git教程学习笔记

    廖雪峰git简单教程学习笔记 教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b ...

  3. 廖雪峰Git教程读书笔记

    因为多人协作导致的不确定因素太多,git需要处理各种各样的情况,除了在多人协作开发过程中用到的常用git命令之外,其它一些不常见的命令的原理和命令都能够在廖老师的教程中给予解答,光通过度娘看解决方法是 ...

  4. java廖雪峰_廖雪峰Java教程学习笔记(一)——Java程序基础

    (一)Java程序基本结构 Java是面向对象的语言,一个程序的基本单位就是class.在class内部,可定义若干方法. 类名要求: 类名必须以英文字母开头,后接字母,数字和下划线的组合 习惯以大写 ...

  5. 廖雪峰JS教程学习记录---字符串

    1.由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用'...'表示`这是一个 多行 字符串`; 2.字符串常见的操作如下: s.length; // 13 要 ...

  6. 廖雪峰javascript教程学习记录

    $1.数据类型和变量 1.不区分整数和浮点数,统一用Number 2.字符串String 3.布尔值 注意: (1) 实际上,JavaScript允许对任意数据类型做比较; 要特别注意相等运算符==. ...

  7. 廖雪峰JS教程学习记录----Map和Set

    Map和Set Map Map是一组键值对的结构,具有极快的查找速度. 1.解决问题: JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构,即一组键值 ...

  8. mysql 廖雪峰_mysql查询(廖雪峰sql教程学习摘录)

    mysql默认不区分大小写 条件查询 select * from students                                                            ...

  9. 廖雪峰python教程视频-为什么看不懂廖雪峰的Python学习教程?

    廖雪峰的Python教程已经很友好了,接近于把饭喂到嘴边了. 这不是廖雪峰教程的问题,而是一个基础代码技能和实际应用需求的代码技能差距太远导致的. 如果是新手,只学会了廖雪峰Python教程,那约等于 ...

最新文章

  1. 22.Chain of Responsibility(职责链)模式
  2. 想买啥 VS 买了啥!理想与现实的差距咋就这么大咧?
  3. Java判断类和实例的关系
  4. fcm脑图像分割matlab,MATLAB程序:用FCM分割脑图像
  5. EDS之后的block
  6. python json数据格式
  7. JavaScript如何调用摄像头
  8. 清华大学计算机考研资料汇总
  9. 冰点文库下载器绿色版V3.2.15(0914)
  10. [XJTUSE编译原理] 第三章 上下文无关文法
  11. 数学建模论文写作方法大总结
  12. oracle数据库表格连接数据库,excel中连接表格数据库-excel怎样连接oracle数据库(白痴级提问)...
  13. for循环练习题-编写程序,根据输入行数,输出金字塔图案
  14. cad打开服务器文件太慢,CAD打开文件很慢怎么处理
  15. codewars练习(javascript)-2021/3/23
  16. c语言2维数组每一行最小值,二维数组每一行最大值
  17. pubwinol免刷_Pubwin万象OL实名一键自动处理程序
  18. 服务器灰度部署和原理
  19. matplotlib之pyplot模块之坐标轴配置(axis():设置坐标轴外观、设置坐标轴范围)
  20. 深度分析:云控系统有什么功能,工作室用的话咋样?

热门文章

  1. Google 相册风格的RecyclerView多选效果: drag-select-recyclerview
  2. 常用五金紧固件选择表
  3. [源码和文档分享]基于Java语言的电梯调度模拟程序
  4. 如何对扫描文件进行编辑
  5. 职场巨婴图鉴:没带实习生吃午饭,她把我怼上热搜
  6. [转]浅谈apple设计中的黄金分割
  7. 2019年税务编码分类_2019年最值得学习的编码语言
  8. web前端开发入门之HTML完整版
  9. 投行女自述:我的投行生涯
  10. oracle表数据修改、删除