Python简介与基础

Python控制结构

组合数据类型

综述

组合数据类型更能够将多个同类或不同类型组织起来,通过单一的表示使数据更有序、更容易。根据数据之间的关系,组合数据类型可以分为3类:序列类型、集合类型和映射类型。

序列类型是一个元素向量,元素之间的存在先后关系,通过序号访问,元素之间不排他。

集合类型是一个元素类型,元素之间无序,相同元素在集合中唯一存在。

映射类型是键值数据项的组合,每个元素是一个键值对,没有顺序,键唯一存在。

附:序列类型和映射类型是一类数据类型的总称,不是具体类型。

序列类型

序列类型通用函数

序列类型(元组,字符串,列表都可以使用以下操作)

操作符

运算

x (not) in s

是否在内,输出正误

s + t

连接st,不是按索引求和

s * t (t * s)

重复

s[i]

索引

s[i:j:k]

切片

len(s)

求长

min/max(s)

求最值(str比ASCII)

sum(s)

求和

s.index(x)

x第一次出现的索引

s.count(x)

x出现总数

sorted(iter, key, reverse)

返回新的排序后序列类型

reversed()

返回倒序后迭代器,建议再套个list()

enumerate(A[, start=0])

返回迭代器,套list()后形成索引与值的元组列表

​a = [1,2,3,4] b=a[::-1]这是切片,切片是得到了一个新的列表,属于浅拷贝,对a修改不影响b,反过来也是。

字符串

字符串是不可变类型,所以字符串方法不改变原字符串,而是生成新副本。

函数和处理方法

描述

str(x)

返回任意类型对应字符串形式

chr(x)

十六进制/十进制Unicode转单字符

ord(x)

单字符转Unicode,得到十进制数

hex(x)

返回整数x对应16进制数小写形式字符串

oct(x)

返回整数x对应8进制数小写形式字符串

bin(x)

返回整数x对应2进制数小写形式字符串

str.lower()

返回副本,全小写

str.upper()

返回副本,全大写

str.split(sep=None)

返回列表,str根据sep分隔,默认空格

str.count(s)

数数

str.replace(old, new)

返回副本,old都被改为new

str.center(width, fillchar)

宽度不够就输出全部,居中,fillchar默认空格(可修改为单字符)

str.strip(chars)

去掉str两侧chars列出的字符

str.join(iter)

将iter(主体,一种组合数据类型)变量的

每一个元素后增加一个str字符串(客体)

a=" ".join(["1","2","3"]) #a = "1 2 3"

a=" ".join([1,2,3]) #出错

数值类型转换

#int(x)

#str类int/int/float => int

int("12") #输出12,支持str类int

int(12.34) #输出12,支持float

int("101",2) #输出5,进制转换必须str类int

int("12.34") #出错

int("12g") #出错

int(12g) #出错

int(101,2) #出错

int("101.5",2)#出错

#float(x)

#int/str类 => float

float(12)

float("12")

float(12.0)

float("12.0") #都输出12.0

#str(x)

#int/float => str类

str(10.01) #输出"10.01"

str(1010+101) #输出"1111"

str("1010"+"101") #输出"1010101"

列表

是有序序列,但内部可以更改,列表无长度限制,元素类型可以不同,不需要预先定义长度。

列表创建方法如下:

a=[1010,"1010",[1010,"1010"]]

a=list("由字符串生成一个字一个元素")

a=list() #空列表

由于类型可变

就有

ls[i]=k 在原列表修改某个元素

ls[i:j:k]=lt 在原列表一部分改为新列表

ls=[i for i in range(6)]

ls[1:5:2]=["a","b"] #如果个数不对会出错

print(ls) #输出[0, "a", 2, "b", 4, 5, 6]

del [i]/[i:j:k] 删除一部分

当然也有len(ls) ls.index(x) ls.count(x) x (not) in ls +/* min/max(x) list(x) 等方法操作

list(x) 将变量x转化为列表类型,可以是字符串、集合也可以是字典(但是形成的是键的列表)

列表的特殊函数与操作

由于列表可变,几乎所有方法不需要ls=ls.fn(x),因为原列表已经被改变。

如果写成l(或者是另外的a变量)=ls.fn(x),只会得到None

直接ls.fn(x)才是对的。

函数和处理方法

描述

ls.append(x)

在最后加元素

ls.insert(i, x)

在第i位置加元素x

ls.clear()

清空

ls.pop(i)

取出并返回第i位置元素并删除,默认最后一个元素

ls.remove(x)

删除第一次出现的元素x,不返回

ls.reverse()

元素反转(类比序列方法reversed())

ls.sort(reverse=False, key=None)

列表排序(类比序列方法sorted())

str.split(sep=None)

返回列表,str根据sep分隔,默认空格

str.count(s)

数数

ls.copy()

例外,生成新列表,浅拷贝

元组

不可更改的序列类型(但是元组中可变的元素仍然是可以进行修改的,做字典的键的元组不能含可变的列表、字典、集合),元组可以实现的操作都可以由列表完成,如果不需要修改数据可以把列表换成元组类型,python对元组处理效率高。

元组创建方法如下:

a=(1, 2, 3)

a=1, 2, 3

a=(1, )

a=1,

a=tuple()

a=()

#以下错误,括号只能放一个序列类型

a=tuple(1, 2, 3)

#以下正确

a=tuple([1, 2, 3]) #a=[1, 2, 3]

a=tuple({2:3, 4:5}) #a=[2, 4]

当函数返回多个值,多个返回值以元组类型返回,实际上是返回一个数据类型。

def f(x):

return x, x+1, x+2

print(type(f(1))) #输出

集合

集合中的元素不可重复,元素类型只能是不可变数据类型(整数,浮点数,字符串,元组等),不能是列表,字典,集合。

集合可以进行数据去重操作。

集合元素间不能比较和排序。

空集合用set()表示,对比{}表示空字典

操作符

运算

S-T

差集

S&T

交集

S|T

并集

S^T

对称差分

可以使用S-=T进行增强操作,运算的同时更新S集合

集合类型常用的函数或方法

函数或方法

描述

S.add(x)

把x加到S中(类比列表L.append(x))

S.remove(x)

移除x,不存在会产生KeyError异常

S.discard(x)

移除x,不存在也不报错(与上对比)

S.clear()

移除所有数据但不去除集合本身

S.pop()

随即返回并删除这个元素来更新S,如果s为set()会产生异常

其他也有len(S) x (not) in S S.copy()(浅拷贝)等

字典

不可变组合类型、基本数据类型可以作为键,元组在各个元素不可变时可做键,列表、集合和其他字典不可做键。

对字典for i in d遍历时,i是字典的每一个键

字典函数和方法

操作符

运算

d.keys()

返回所有键

d.values()

返回所有值

d.items()

返回所有键值对

d.get(a key, default=)

键存在返回相应值,

否则返回默认

增加新键值对

d.pop(a key, default=)

键存在返回相应值

并删除键值对

否则返回默认

d.popitem()

随机取出键值对,以元组返回并删除键值对

d.clear()

成为空字典

del d[x]

删除以x为键的键值对

注意:keys,values,items方法返回的是特殊的内部数据类型,想更好的使用返回数据最好利用list()转化成列表,键值对以元组类型储存在列表里。

字典与序列类型类似的通用操作

in 判断一个键是否在字典中

len(d)字典键值对数量

min/max(b) 返回最小最大的索引值(前提是字典中各个索引元素可以比较)

字典的索引

print(d[x]) #输出x对应的键

d[x] = 1 #修改字典键值对,也可以增加新键值对

字典创建方法如下:

a={"1":2, "3":4}

a=dict()

a={}

#错误方法

a={(1,2), (3,4)} #创建的是含两个元组的集合

#正确方法可使用dict(),这个括号里只能有一个大类,大类里有小类,每个小类两个元素(长为2)

a=dict(([1,2], [3,4]))

a=dict([((1,2),2), ((3,),4)])

深拷贝与浅拷贝

python中,变量与变量的值占用不同的内存。变量占用的内存,并非直接存储数值,而存储的是值在内存中的地址。

ls = ["中国","矿业","大学"]

ls1 = ls #ls1 = ls 实际上是ls1指向了ls指向的地址块,两者指向的是同一块地址区域,不是拷贝

print(ls1) #输出ls = ["中国","矿业","大学"]

ls.append("憨憨") #对ls进行元素操作时,也是对ls1造成影响

print(ls1) #输出["中国", "矿业", "大学", "憨憨"]

ls2 = ls[:] #利用切片,在内存中新建了一个列表,ls2指向这个新的列表,浅拷贝

print(ls2) #输出ls = ["中国","矿业","大学", "憨憨"]

ls.append("憨包") #对ls的元素进行任何操作,都不会影响ls2的内容

print(ls2) #输出ls = ["中国","矿业","大学", "憨憨"]

a = 1 b= a这不是拷贝,赋值是多个变量指向同一个内存地址,内存的任一元素改变,所有变量都受影响

​a = [1,2,3,4] b=a[:]这是切片,切片是得到了一个新的列表,属于浅拷贝

浅拷贝x.copy()

对只有一层元素关系的列表进行测试:

ls = ["python","c","cpp"]

ls1 = ls.copy()

print(id(ls),id(ls1)) #输出 2551633171528 2551633985416,可见二者指向的内存地址不同

ls.append("php")

ls1.append("java")

print(ls) #输出 ["python", "c", "cpp", "php"],对ls的append操作没有影响ls1

print(ls1)#输出 ["python", "c", "cpp", "java"],对ls1的append操作没有影响ls

从以上结果可得:在copy完之后,新的列表指向新的内存地址,分别对列表的最后一位进行appen操作,结果互不影响。

对具有二层的元素的列表进行测试:

##对ls的第二个元素进行append操作

ls = ["德玛",["费欧娜","戴安娜"],"赵信"]

ls1 = ls.copy()

print(ls1) #输出["德玛", ["费欧娜", "戴安娜"], "赵信"]

ls[1].append("莫甘娜") #copy完成后对ls的第二个元素进行append操作

print(ls1) #输出"德玛", ["费欧娜", "戴安娜", "莫甘娜"], "赵信"],ls1发生了改变

print(id(ls[1]),id(ls1[1])) #查看两者的ID,2202073060424 2202073060424

##对ls1的第二个元素进行操作

ls = ["德玛",["费欧娜","戴安娜"],"赵信"]

ls1 = ls.copy()

print(ls) #输出["德玛", ["费欧娜", "戴安娜"], "赵信"]

ls1[1].append("莫甘娜")#copy完成后对ls1的第二个元素进行append操作

print(ls)#输出"德玛", ["费欧娜", "戴安娜", "莫甘娜"], "赵信"],ls发生了改变

print(id(ls[1]),id(ls1[1])) #输出 2303581443144 2303581443144

从上边输出的结果来看,copy完成之后,分别对ls和ls1的中间元素进行append操作,对方的元素也会发生相应的改变。

结论:浅拷⻉, 只会拷⻉第⼀层内容,只拷贝第二层关系的内存地址,而第⼆层的内容不会拷贝,所以被称为浅拷贝。

深拷贝x.deepcopy()

深拷贝使用之前一定要先加载copy模块

import copy

new_ls = copy.deepcopy(ls)

实例:

#对ls进行二层操作

import copy

ls = ["德玛",["费欧娜","戴安娜"],"赵信"]

ls1 = copy.deepcopy(ls)

ls[1].append("莫甘娜")

print(ls) #输出["德玛", ["费欧娜", "戴安娜", "莫甘娜"], "赵信"]

print(ls1) #输出["德玛", ["费欧娜", "戴安娜"], "赵信"]

#对ls1进行二层操作

import copy

ls = ["德玛",["费欧娜","戴安娜"],"赵信"]

ls1 = copy.deepcopy(ls)

ls1[1].append("莫甘娜")

print(ls) #输出["德玛", ["费欧娜", "戴安娜"], "赵信"]

print(ls1) #输出["德玛", ["费欧娜", "戴安娜", "莫甘娜"], "赵信"]

由以上结果可得:深拷贝是完完全全的复制,是创建一个完完全全的新的对象,新旧对象之间不会相互影响。不可变数据类型新旧列表指向同一个空间,可变类型新列表创建了新的空间。

另附:

a = [1, 2]

a[1] = a #对a列表的第二个元素进行修改成自己

print(a[1]) #输出为[1, [...]]

print(a) #输出为[1, [...]]

print(id(a),id(a[1])) #输出内存地址1191853053000 1191853053000 a与a[1]的内存地址一样

print(type(a[1])) ##输出

分析: a[1] 原来是int类型,在对a[1]进行修改操作时,会先把原来的指向剪断,因为赋值a,指向了自己,此时出现了数据上的死循环。

函数

参数

参数及其传递

#向函数传递信息

def greet_user(username): #username是形参

print("hello," + username + "!" )

greet_user("python") #"python"是实参

在函数名中定义一个形参,函数调用时,给函数名中的形参传递实参。

传递实参的方法有:

位置实参(按照基于实参的顺序关联到形参,有顺序)

关键字参数(类似按照键值对,按照名字进行关联,无顺序问题)

默认值参数(给形参进行固定值作为默认值,如果没有提供实参对默认值进行覆盖处理,则代入默认数值后运行函数)

注意:

两种传参方式可以混合使用,但使用时关键字参数必须位于位置参数之后

可变参数*args与**kwargs

def f(*args, **kwargs):

print("args = ", args)

print("kwargs = ", kwargs)

print()

if __name__ == "__main__":

f(1,2,3,4)

f(a=1,b=2,c=3)

f(1,2,3,4, a=1,b=2,c=3)

f("a", 1, None, a=1, b="2", c=3)

输出结果是

args = (1, 2, 3, 4)

kwargs = {}

args = ()

kwargs = {"a": 1, "c": 3, "b": 2}

args = (1, 2, 3, 4)

kwargs = {"a": 1, "c": 3, "b": 2}

args = ("a", 1, None)

kwargs = {"a": 1, "c": 3, "b": "2"}

这是python中的两种可变参数。

*args表示任何多个无名参数,它是一个tuple

**kwargs表示关键字参数,它是一个dict

同时使用*args和**kwargs时,*args参数必须在**kwargs前,像f(a=1, b="2", c=3, a", 1, None)这样调用的话,会提示语法错误SyntaxError: non-keyword arg after keyword arg

等效的函数调用

函数调用时,无论是使用位置参数还是关键字参数、默认值参数,得到的结果都是一样的。

#一个名为harry的小狗

def describe_pet(pet_name,animal_type = "dog"):

函数省略

describe_pet(pet_name="harry")

describe_pet("harry")

两次使用describe_pet()函数的结果一致

全局变量和局部变量

这是两种不同的变量

局部变量是函数内部的占位符,与全局变量可能重名但是不同

函数运算结束后,局部变量被释放,不再进行储存

可以使用global保留字,从而在函数内部使用全局变量

局部变量为组合数据类型且未创建,等同于全局变量

ls=["x", "y"] #真实创建了一个ls全局变量列表

def f(n):

ls.append(n) #ls是列表类型,没有真实创建,等同于全局变量

return #加不加return都是一样的

f("z") #全局变量被修改

print(ls)

以上输出为["x", "y", "z"]

ls=["x", "y"] #真实创建了一个ls全局变量列表

def f(n):

ls = [] #ls是列表类型,真实创建,在这里ls是局部变量

ls.append(n)

return #加不加return都是一样的

f("z")

print(ls)

以上输出为["x", "y"]

规则总结

基本数据类型,无论是否重名,局部变量与全局变量不同

可以通过global保留字在函数内部声明全局变量

组合数据类型,如果局部变量未真实创建,则是全局变量

另附:

return在不带参数的情况下(或者没有写),默认返回None

文件

数据分析与爬虫

内库与三方库

python基本原理-Python理论基础知识复习相关推荐

  1. python 理论基础知识试题_Python理论基础知识复习

    1.Python语言简介与基础 2.Python控制结构 3.字符串与组合数据类型 4.函数 4.1参数 4.1.1参数及其传递 #向函数传递信息 def greet_user(username): ...

  2. 汇率兑换程序python按温度转换_python复习+实例编写(1)——温度转换、汇率转换...

    (python基础知识复习.温度转换.人民币汇率转换实例) Python语言设计主要分为三步:IPO,即输入.算法.输出. 下面通过一个简单的实例,复习之前学习过的python的部分基础知识. 温度转 ...

  3. Python培训入门基础知识学什么?

    Python培训基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python培训入门基础知识学什么呢?来看看下面小编 ...

  4. 谈谈Python那些不为人知的冷知识(二)

    本文转载自Python的编程时光(ID:Python-Time) 小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来. 从上一篇的分享来看,仍然有不少 Pythoner 对这些冷知识存在盲 ...

  5. python编程基础知识体系_最新版 17 幅思维导图:Python 编程之核心知识体系

    原标题:最新版 17 幅思维导图:Python 编程之核心知识体系 导读:本文主要涵盖了 Python 编程的核心知识,展示了一系列思维导图,主要就 Python 核心基础知识进行了细致梳理.无论你是 ...

  6. 零基础可以学python吗-学Python需要什么基础知识?零基础可以学Python吗?

    学Python需要什么基础知识?一般来说,想要学Python最好具备一定的计算机专业知识,尤其是数学和英语不错的话,对学Python也有一定的帮助.但是零基础的学习者就不能学Python了吗?当然不是 ...

  7. 学python需要什么基础知识-学Python需要什么基础知识?零基础可以学Python吗?

    学Python需要什么基础知识?一般来说,想要学Python最好具备一定的计算机专业知识,尤其是数学和英语不错的话,对学Python也有一定的帮助.但是零基础的学习者就不能学Python了吗?当然不是 ...

  8. 学python需要什么基础知识-学习Python需要知道哪些基础入门知识?

    众所周知,Python以优雅.简洁著称,入行门槛低,可以从事Linux运维.Python Web网站工程师.Python自动化测试.数据分析.人工智能等职位!就目前来看,Python就业前景广阔.很多 ...

  9. 学python需要什么基础知识-没学过Python先要学习哪些基础知识?

    零基础学Python应该学习哪些入门知识 关于零基础怎么样能快速学好Python的问题,百度提问和解答的都很多,你可以百度下看看.我觉得从个人自学的角度出发,应从以下几个方面来理解: 1 为什么选择学 ...

最新文章

  1. 通过数组名遍历整个数组
  2. 【机器学习】Python机器学习的神器- Scikit-learn使用说明
  3. Spring 容器(Spring 的上下文)
  4. oracle数据库物理结构包含,Oracle - 数据库物理结构
  5. js 转php json string,JS里字符串转json方法总结
  6. linux运行jps五行结果,Linux系统性能监控
  7. ODP.NET连接池性能计数器
  8. c语言~符号_条件编译指令(符号),C语言条件编译指令完全攻略
  9. python 面向对象oop
  10. C# ZipArchive 文件末端错误 的解决方案
  11. JLINK 驱动安装和配置ADS使用,ADX调试
  12. c语言 音符符号大全,音符符号大全
  13. html5广告的版式设计,页面版式设计
  14. python 爬虫-养生之道
  15. [原][译][osgearth]样式表style中参数总结(OE官方文档翻译)
  16. java word合并单元格_java使用freemarker模板导出word(带有合并单元格)文档
  17. SAP中凭证类型中交易类型应用
  18. 对AutoCompleteTextBox的扩展
  19. 【单片机系列】基于51单片机的16路抢答器
  20. scrapy+crawlspider+增量式爬取电影

热门文章

  1. richtextbox识别html,WPF html格式用richtextbox显示出来 Show HTML in RichTextBox
  2. 大象高端营销:装饰公司积分制导入,让你的业绩翻番
  3. android notification的使用方法,详解Android中Notification的使用方法
  4. 如何打开drm?drm是什么格式?
  5. 关于iPhone接入电脑无法识别的问题
  6. 解决QQ连接超时问题
  7. 计算机在职研究生学费多少?贵不贵?
  8. java 员工类算工资_java 编程 计算工人工资,
  9. 告别Mcafee Endpoint Encryption 和 Safeboot 还原被加密的系统
  10. 高中数学基础-1.4.1全称量词与存在量词(一)量词(新)