目录
计算机基本硬件由:CPU/内存/主板/硬盘/显卡/网卡等组成。
Windows
Linux
Mac
编程语言开发的一个工具,主要是用于把代码编译成计算机(系统)能识别的内容并执行。
编译型语言:
执行代码之前,有一个专门的编译过程。把源高级程序编译成一个机器语言,只做一个翻译,运行时不需要编译,所以编译型语言执行效率比较高。语言:C / C++ / Java / C# / Go
解释型语言:解释性语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是在执行的时候才能编译,这样解释型语言每执行一次就要编译一次,效率比较低。语言:Python / PHP / ruby
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,Guido开始写Python语言的编译器。Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的语言,能符合他的理想:创造一种C和shell之间,功能全面,易学易用,可拓展的语言。
最新的TIOBE排行榜,Python赶超PHP占据第4, Python崇尚优美、清晰、简单,是一个优秀并广泛使用的语言。
Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。
计算机中的所有数据,不论是文字、图片、视频、还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的。
ASCII
最多只能用8位来表示(一个字节),即:2**8 -1 = 256(即pow(2,8)=256),
所以,ASCII码最多只能表示255个符号。
utf-8
万国码的升级版,一个中文字符==三个字节,英文是一个字节,欧洲的是2个字节
GB2312
国家1980年的一个标准《中华人民共和国国家标准 信息交换用汉字编码字符集 基本集 GB2312-80》。这个标准用两个数来编码汉字和中文符号。第一个数称为“区”,第二个数称为“位”。所以也称为区位码。
GBK
在国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。一个中文字符==2个字节,英文是一个字节。
unicode # 包含所有语言的编码。用一个字符==两个字节(如果要用到非常偏僻的字符,就需要4个字节)。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
2.*版本: ASCII
3.*版本: UTF-8
如果要修改默认编码,只需在代码首行添加:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
1、Cpython:最常用的官方版本,使用C语言实现。使用最为广泛。
2、Jpython:Python的Java实现,Jpython会将Python代码动态编译成Java字节码,然后在JVM上运行。
3、IronPython:Python的C#实现,IronPython将Python代码编译成C#字节码,然后再CLR运行(与Jpython类似)
4、PYPY(特殊): Python实现的Python,将Python的字节码再编译成机器码。
必须以:字母、下划线(_)、数字组成,其中数字不能开头;
不能以python关键字命名变量,但可以包含关键字;
不能包含空格;
关键字
None
del
True / False
if / elif / else
for / in / while / break / continue / yield / with
and / or / not / is / as
def / return / global / nonlocal / lambda / pass / class / assert
import / form / raise / finally
try / except
Python 数字数据类型用于存储数值。数据类型是不可变,这就意味着如果改变数字数据类型的值,将重新分配内存空间。
由十进制整数0~9组成的数为int类型。
py2.*版本中有:int / long
py3.*版本只有:int
>>> a = 1
>>> type(a)
<class 'int'>
除法区别
在py2.*版本中,作除法运算时,会把小数点后面的部分去掉,只保留整数部分;
在py3.*版本中,作除法运算时,会把小数点后面的部分保留,返回值为浮点数类型;
# py2.7
>>> 1/2
0
# py3.6
>>> 1/2
0.5
带小数的整数,都为浮点数类型。
>>> b = 1.5
>>> type(b)
<class 'float'>
复数是由一个实数和一个虚数组合构成,表示为:x+yj;一个复数时一对有序浮点数 (x,y),其中 x 是实数部分,y 是虚数部分。
>>> a = 3.14j
>>> a
3.14j
>>> type(a)
<class 'complex'>
布尔值是用来表示真假,用True和False表示。
False: None /' ' /[ ] /( ) /{ } / 0
True:非空非0的都为真
python 要求字符必须使用引号括起来的,可以为单引号、双引号、三引号;字符串可以包含任意字符,数据类型为不可变。字符串在内存中使用编码Unicode编码储存数据。
注意:字符串的所有方法基本上都是返回新的值。
>>> a = 'abc'
>>> b = '123'
>>> c = "世...界"
>>> d = ''' def '''
>>> print(type(a), type(b), type(c),type(d))
<class 'str'> <class 'str'> <class 'str'><class 'str'>
用索引方式对字符串进行切片操作,索引从0开始计数
string = 'hello world'
string[:]
'hello world'
string[0] # 第一个字符
'h'
string[-1] # 最后一个字符
'd'
string[0:5] # 从第0位至第4位,前包后闭
'hello'
string[:5]
'hello'
string[6:-1] # 从第6位至倒数第二位,前包后闭
'worl'
string[6:]
'world'
string[::2] # 从头到尾,每次隔2步取一次
'hlowrd'
string[::-2] # 同上,倒取字符
'drwolh'
string[::-1] # 同上,倒取字符
'dlrow olleh'
str() | repr()
ss = 'abcd' # 两种不同的数据类型转换显示格式
print(str(s)) >>> abcd # 不带冒号
print(repr(s)) >>> 'abcd' # 带冒号
+ 字符串连接
s1 = 'hello'
s2 = 'world'
s1 + s2
'helloworld'
join 将序列中的元素以指定的字符连接生成一个新的字符串
s1 = 'abcd'
s2 = '-'
s2.join(s1)
'a-b-c-d'
''.join(s1) # 可以指定符号(任意类型)进行拼接 'abcd'
split() # 从右边开始按指定字符分割,可限制分割次数,返回list
rsplit() # 从左边开始按指定字符分割,可限制分割次数,返回list
partition() # 按指定的字符串分为三份:前面、自己、后面。
s1 = '欢迎,来到python,世界!'
s1.rsplit(',',1)
['欢迎,来到python', '世界!']
s1.split(',',1)
['欢迎', '来到python,世界!']
s1 = '欢迎,来到python,世界!'
print(s1.partition("python"))
('欢迎,来到', 'python', ',世界!')
* 字符串重复次数
s1 = 'a'
s1 * 5
'aaaaa'
s2 = '中国'
s2*2
'中国中国'
replace() 把指定的内容替换成别的内容
s1 = 'Hello world'
s2 = 'Python'
s1.replace('world',s2)
'Hello Python'
s1.replace('world','Python')
'Hello Python'
strip() 删除两边的空格(默认:\n,\t,空格)
lstrip() 删除左边的空格
rstrip() 删除右边的空格
s1 = " ab cd " # 删除空格,注意字符与字符之间的空格不会被删除
s1.strip()
'abcd'
s1.lstrip()
'abcd '
s1.rstrip()
' abcd'
s1 = "abcd" # 删除指定字符
s1.strip("") 'abcd' s1.lstrip("")
'abcd' s1.rstrip("") '*abcd'
title() 改为标题格式(单词首字母大写)
s = 'this is a title'
s.title() #
'This Is A Title'
upper() | isupper() 全部改为大写|判断全部字符串为大写
s = 'abcdefg'
s.upper()
'ABCDEFG'
lower() | islower() | casefold() 全部改为小写|判断全部字符串为小写|全部改为小写包括特殊字符
s = 'ABCDEFG'
s.lower()
'abcdefg'
s.islower()
False
s.casefold()
'abcdefg'
capitalize() 第一个字母改为大写
s = 'abcdefg'
s.capitalize()
'Abcdefg'
swapcase() 互转,全部字母大小写转换
s = 'ABC def'
s.swapcase()
'abc DEF'
isdecimal() 判断是否为十进制数字
isdigit() 判断是否为数字,特殊数字也可以判断为真True(非中文)
isalpha() 判断字符串是否为字母
isalnum() 判断字符串是否为字母或数字或字母数字组合
s1 = 'abcd'
s2 = '1234'
s3 = '123①②③'
s1.isdecimal() # 只判断十进制数字
False
s2.isdecimal()
True
s3.isdigit()
True
#######################################
s1 = 'abcd'
s2 = '1234'
s1.isalpha()
True
s2.isalpha()
False
#######################################
s1 = 'abcd'
s1.isalnum()
True
s4 = '1234'
s4.isalnum()
True
s2 = 'abcd1234'
s2.isalnum()
True
s3 = 'abc123…'
False
startswith() 判断开头是否为指定的字符开头
endswith() 判断结尾是否为指定的字符结尾
s = 'abcd1234'
s.startswith('a')
True
s.startswith('b')
False
s.endswith('a')
False
s.endswith('4')
True
count() 计算个数
s = "this is string example….wow!!!"
s.count('i') # 计算指定的字符,在目标字符串中有几个
3
s.count('i',5,13) # 5,13 表示计算的范围
2
len() 计算字符串长度
s = "this is string example….wow!!!"
len(s)
32
find() # 查询指定字符是否存在目标字符串中,是:返回索引,否:返回-1;
index() # 查询指定字符是否存在目标字符串中,是:返回索引,否:报错;
s = "abcdefg"
s.find('g')
6
s.find('2')
-1
s.index('g')
6
s.index('2')
Traceback (most recent call last):
File "", line 1, in
ValueError: substring not found
center() 将字符串居中,并用空格或指定字符填充
ljust() 将字符串左对齐,并用空格或指定字符填充
rjust() 将字符串右对齐,并用空格或指定字符填充
s = 'abcd'
s.center(8)
' abcd '
s.center(8,'-')
'--abcd--'
s.rjust(8)
' abcd'
s.ljust(8)
'abcd '
s.ljust(8,'-')
'abcd----'
s.rjust(8,'-')
'----abcd'
>>> s = b'hello'
>>> print(s)
b'hello'
>>> print(s[0])
104
>>> print(s[2:4])
b'll'
>>> s1 = bytes('我爱python', encoding='utf-8')
>>> print(s1)
b'\xe6\x88\x91\xe7\x88\xb1python'
转义字符
描述
\\
反斜杠符号
\'
单引号
\''
双引号
\n
换行
\t
制表符
\r
回车
符号
描述
%s
格式化字符串
%r
格式化字符串,repr()格式显示
%d
格式化整数
%f
格式化浮点数
%i
格式化十进制整数
str.format()
基本语法是通过 {} 和 : 来代替以前的 % 。可以接受不限个参数,位置可以不按顺序。
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
运算符
描述
+
加 - 两个对象相加
-
减 - 得到负数或是一个数减去另一个数
*
乘 - 两个数相乘或是返回一个被重复若干次的字符串
/
除 - x 除以 y
%
取模 - 返回除法的余数
**
幂 - 返回x的y次幂
//
取整除 - 向下取接近商的整数
运算符
描述
实例
==
等于 - 比较对象是否相等
(a == b) 返回 False。
!=
不等于 - 比较两个对象是否不相等
(a != b) 返回 True。
>
大于 - 返回x是否大于y
(a > b) 返回 False。
<
小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。
(a < b) 返回 True。
>=
大于等于 - 返回x是否大于等于y。
(a >= b) 返回 False。
<=
小于等于 - 返回x是否小于等于y。
(a <= b) 返回 True。
运算符
描述
实例
=
简单的赋值运算符
c = a + b 将 a + b 的运算结果赋值为 c
+=
加法赋值运算符
c += a 等效于 c = c + a
-=
减法赋值运算符
c -= a 等效于 c = c - a
*=
乘法赋值运算符
c *= a 等效于 c = c * a
/=
除法赋值运算符
c /= a 等效于 c = c / a
%=
取模赋值运算符
c %= a 等效于 c = c % a
**=
幂赋值运算符
c **= a 等效于 c = c ** a
//=
取整除赋值运算符
c //= a 等效于 c = c // a
:=
海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符。
在这个示例中,赋值表达式可以避免调用 len() 两次:if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
运算符
描述
实例
in
如果在指定的序列中找到值返回 True,否则返回 False。
x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in
如果在指定的序列中没有找到值返回 True,否则返回 False。
x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
运算符
描述
实例
&
按位 与 运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
(a & b) 输出结果 12 ,二进制解释: 0000 1100
|
按位 或 运算符:只要对应的二个二进位有一个为1时,结果位就为1。
(a | b) 输出结果 61 ,二进制解释: 0011 1101
^
按位 异或 运算符:当两对应的二进位相异时,结果为1
(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~
按位 取反 运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1
(~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<<
左移动 运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
a << 2 输出结果 240 ,二进制解释: 1111 0000
>>
右移动 运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数
a >> 2 输出结果 15 ,二进制解释: 0000 1111
运算符
逻辑表达式
描述
and
x and y
布尔"与" - 如果 x 为 True,x and y 返回 y 的计算值,否则它返回 x。
or
x or y
布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。
not
not x
布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。
运算符
描述
实例
is
is 是判断两个标识符是不是引用自一个对象
x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is not
is not 是判断两个标识符是不是引用自不同对象
x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。
运算符
描述
x[index] 或 x[index: index2[:index2]]
索引运算符 (最高优先级)
x.attribute
属性访问
**
指数
~ + -
按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % //
乘,除,求余数和取整除
+ -
加法 减法
>> <<
右移,左移运算符
& ^ |
与 、异或、或(左高)
== != > < >= <=
比较运算符
= %= /= //= -= += *= **=
赋值运算符
is is not
身份运算符
in not in
成员运算符
not and or
逻辑运算符
#号注释
三引号注释
''' 单引号注释,多行注释'''
""" 双引号注释,多行注释"""
list = [] 中括号表示列表,列表中的每个元素都对应一个索引,第一个元素的索引值是0,第二个元素的索引值是1,依次类推;列表是可变数据类型。
注意:列表所有的方法基本上都是返回None。
索引 | 切片 | + | *
lists = ['a','b','c','d','e','f']
print(lists[0]) # 索引
print(lists[-1])
print(lists[:]) # 切片
print(lists[1:-1])
lists1 = [1,2]
print(lists + lists1) # + 连接
print(lists1 * 3) # * 重复
a # 以下为输出值
f
['a', 'b', 'c', 'd', 'e', 'f']
['b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e', 'f', 1, 2]
[1, 2, 1, 2, 1, 2]
append() # 列表中添加元素
extend() # 列表中追加元素
insert() # list.insert(index, obj),插入指定索引位置。
index() # list.index(str, beg=0, end=len(string)),查询目标中是否包含子字符串 str,是返回索引值,否报错(ValueError)。
lists1 = [1,2]
lists1.append('a')
print(lists1) #>>> [1, 2, 'a']
lists1.append([33,44])
print(lists1) #>>> [1, 2, 'a', [33, 44]]
lists1.extend('b')
print(lists1) #>>> [1, 2, 'a', [33, 44], 'b']
lists1.extend([11,22])
print(lists1) #>>> [1, 2, 'a', [33, 44], 'b', 11, 22]
lists1.insert(0,'aa')
print(lists1) #>>> ['aa', 1, 2, 'a', [33, 44], 'b', 11, 22]
print(lists1.index(2)) #>>> 2
remove() # 删除指定元素
pop() # 删除,指定索引位置,默认最后一位
del a[:] # 删除全部或指定索引
clear() # 清空全部元素
lists1 = ['aa', 1, 2, 'a', [33, 44], 'b', 11, 22]
lists1.remove('a')
print(lists1) #>> ['aa', 1, 2, [33, 44], 'b', 11, 22]
a1 = lists1.pop()
print(a1, lists1) #>> 22 ['aa', 1, 2, [33, 44], 'b', 11]
a2 = lists1.pop(3)
print(a2,lists1) #>> [33, 44] ['aa', 1, 2, 'b', 11]
del(lists1[1])
print(lists1) #>> ['aa', 2, 'b', 11]
a3 = lists1.clear()
print(a3,lists1) #>> None []
reverse() # 反转,列表反过来
sort() # 排序,默认从小到大,还可传入key和reverse两个参数,当key=len时会按长度排序;当reverse=True时按从大到小排序,默认为False。
count() # str.count(sub, start= 0,end=len(string)),统计个数
copy() #浅拷贝,返回新的值
L = ['a', 'b', 'c', 'd']
L.reverse()
print(L) #>> ['d', 'c', 'b', 'a']
L = [9,1,5,3,2,4]
L.sort()
print(L) #>> [1, 2, 3, 4, 5, 9]
L = [9,1,5,1,2,1]
a = L.count(1) # 计算元素在列表中存在个数
print(a) #>> 3
L = [9,1,5,1,2,1]
a = L.copy() # 浅拷贝
print(a) #>> [9, 1, 5, 1, 2, 1]
count() # str.count(sub, start= 0,end=len(string)),统计个数,可指定统计的元素,是返回个数,否返回0
indxe() # str.index(str, beg=0, end=len(string)),查找目标中是否包含子字符串 str,是返回索引值,否报错(ValueError值错误)。
max(tuple) # 返回元组中最大的元素,必须元素类型一致,否则报错(TypeError类型错误)
min(tuple) # 返回元组中最小的元素,必须元素类型一致,否则报错(TypeError类型错误)
tuple1 = ('aa', 1,1,1, 2, 'a', [33, 44], 'b', 11, 22)
tuple2 = (1,2,3,4,5,6,7)
print(tuple1.index('b')) #>> 7
print(tuple1.count(1)) #>> 3
print(max(tuple2)) #>> 7 c
print(min(tuple2)) #> 1 a
keys() # 字典的键值
values() # 字典的值
items() # 字典的键值对
get() # 获取键对应的值,需指定键,如没有返回None
update(dict2) # 更新字典中的value,可追加新的字典,返回值为None
d = {'a':1,'b':2}
s1 = d.keys()
print(list(s1),d.keys()) #>>['a', 'b'] dict_keys(['a', 'b'])
s2 = d.values()
print(list(s2),d.values()) #>>[1, 2] dict_values([1, 2])
s3 = d.items()
print(list(s3),d.items()) #>>[('a', 1), ('b', 2)] dict_items([('a', 1), ('b', 2)])
print(d.get('a')) #>>1
d2 = {'c':11}
print(d,d.update(d2)) #>>{'a': 1, 'b': 2, 'c': 11} None
d2 = {'a':22}
print(d,d.update(d2)) #>>{'a': 22, 'b': 2, 'c': 11} None
clear() # 清空字典,返回None
pop() # 删除指定键的值,返回被删除的值
popitem() # 随机返回并删除字典中的最后一对键和值,字典为空时报错(KeyError)
del dict[keys] # 删除全部键值对或指定键对应的值
dict1 = {'Name': 'Runoob', 'Age': 7}
c = dict1.clear()
print(dict1) #>> {}
pi = dict1.popitem()
print(pi,dict1) #>> ('Age', 7) {'Name': 'Runoob'}
po = dict1.pop('Name')
print(po,dict1) #>> Runoob {'Age': 7}
del dict1['Name']
print(dict1) #>> {'Age': 7}
copy() # 返回一个字典的浅复制。
d1 = {'a':1,"b":2}
d2 = d1.copy()
print("d1:%s, d2:%s" %(d1,d2))
d1:{'a': 1, 'b': 2}, d2:{'a': 1, 'b': 2}
fromkeys() # dict.fromkeys(seq[, value]),用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值(默认:None)。
d = ('a','b','c')
new_d = new_d.fromkeys(d)
print(new_d) #>> {'a': None, 'b': None, 'c': None}
new_d2 = new_d.fromkeys(d,10)
print(new_d2) #>> {'a': 10, 'b': 10, 'c': 10}
setdefault() # dict.setdefault(key, default=None), 和 get()方法类似,返回指定键的值,如果键不存在于字典中,将会添加键并将值设为默认值。
dict1 = {'Name': 'Runoob', 'Age': 7}
print(dict1.setdefault('Age', None)) #>> 7
print(dict1.setdefault('Sex', None)) #>> None
print("新字典为:", dict1) #>>新字典为: {'Name': 'Runoob', 'Age': 7, 'Sex': None}
add() # 添加元素,如元素存在则忽略
update() # 更新元素,如元素存在则忽略
s = {1}
s.add('a')
print(s) #>> {1, 'a'}
s2 = {11,22}
s.update(s2)
print(s) #>> {1, 11, 'a', 22}
clear() # 清空全部
discard() # 删除集合中指定的元素
pop() # 删除
remove() # 删除元素
copy() # 浅拷贝
s = {1, 11, 'a', 22}
a = s.clear()
print(s,a) #>> set() None
s.discard('a')
print(s) #>> {1, 11, 22}
s.pop()
print(s) #>> {11, 'a', 22}
s.remove(22)
print(s) #>> {1, 11, 'a'}
s1 = s.copy()
print(s1) #>> {1, 11, 'a', 22}
a.intersection(b) # 交集
a.union(b) # 并集
a.difference(b) # 差集
s1 = {1, 11,22}
s2 = {1,2}
print(s1.intersection(s2)) # >> {1}
print(s1.union(s2)) #>>{1, 2, 22, 11}
print(s1.difference(s2)) #>> {11, 22}
索引
切片
步长
len() # 支持:list|tuple|dict |set
count() # 支持:list|tuple
indxt() # 支持:list|tuple
romove() # 支持:list|set
update() # 支持:dict|set
clear() # 支持:list|dict |set
copy() # 支持:list|dict |set
pop() # 支持:list|dict|set
del() # 支持:list(可指定索引)|dict(可指定keys)
if :…elif :…else :…
if 条件:
语句体
elif 条件:
语句体
else:
语句体
for..in.. :
for i in 条件:
语句体
while True: …
while 条件(True|False):
语句体
break # 终止循环
continue # 跳出当前循环
格式:v = 前面 if 条件 else 后面 # 适合于简单的判断语句。
v = 前面 if 条件 else 后面
# 上面和下面的用意一致
if 条件:
v = 前面
else:
v = 后面
注意:操作文件时,要按照:以什么编码写入,就需用什么编码打开。
file = open('路径',mode='读取方式',encoding='编码格式')
file.wite() # 写
file.read() # 读
file.close() # 关闭文件
r | w | a | + # 只读|只写|只追加 | 更新文件(可读可写)
r+ | w+ | a+ # 可读写追加
rb | wb | ab # # 二进制只读|二进制只写|二进制只追加
rb+ | wb+ | ab+ # 二进制可读写追加
read() 读取文件全部内容
read(1) 1表示读取一个字符,二进制读取只取一个字节
readline() 从文件读取一整行,包括 "\n" 字符。
readlines() 读取所有行并返回列表
write() 写,支持字符串,二进制
writelines( [str] ) 向文件中写入一序列的字符串,换行需要加\n。
seek(3) 3表示光标跳转位置,无论什么模式打开,都是按字节处理
tell() 返回光标所在的字节位置
flush() 强制把内存中写的内容更新到文件中
close() 手动强制关闭
with open() as f: 内部执行完毕后自动关闭文件
方式一:先读取文件的所有内容,在修改指定的内容,最后在修改后的全部内容写入文件中。
with open('a.txt',r)as f1:
date = f1.read() # 先读取文件内容
n_date = date.replace(替换内容) # 修改指定的内容
with open('a.txt',r)as f2:
date = f1.write(n_date) # 再把修改后的全部内容重新写入文件中
方式二(适合大文件):先一点点按行读取文件,在修改指定的内容,最后把修改的内容写入另一个文件中。
with open()as f1, open()as f2: # 同时打开两个文件格式
for line in f1: # 读取第一个文件,循环每一行
n_line = line.replace(替换内容) # 修改指定的内容
f2.write(n_line) # 把修改后的内容写入到新文件中
window: ./system32/a.txt
linux: ..\image
unix: ..\image
window: ./system32/a.txt
linux: \home\xd1\image
unix: \home\xd1\image
python内置的 os 模块,就是针对文件夹、目录相关操作的。
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数代码块以 def 关键字开头,后接函数名和小括号组成:def name(参数):pass
任何传入参数和自变量必须放在圆括号中。
函数内容以冒号开始,并且代码块缩进(4空格)。
一般代码块的第一行需添加注释函数说明。
return[表达式] 输出内容,并结束函数(注意:返回多个数据时,格式为元组)。
def names():
print('这是一个自定义函数')
return 1,2,3 #>> (1,2,3) 返回为元组
注意:函数不被调用,内部代码永远不会执行。
每次调用函数时,都会为此调用开辟一块内存空间,内存中保存以后想要用的值。
def names():
print('这是一个自定义函数')
return 1,2,3
names() # 调用自定义函数
函数中的参数支持任意类型(可变类型 | 不可变类型)的数据;
注意:位置传参必须在关键字传参的前面;
函数定义的参数叫形式参数(形参);
调用函数时传递的参数叫实际参数(实参);
参数分类:
位置参数
默认参数
调用函数时,默认参数的值如果没有传入,则被认为直接使用默认值,注意:默认值如果是可变类型(慎用)。
解释:因为value是可变类型,每次调用这个方法value不会每次都初始化[].而是调用相同的[].
def func(data,value=[]): pass # 不推荐参数value=[]定义
def func(data,value=None):
if not value: # 推荐函数内部中定义参数类型
value = []
不定长参数(*args)
关键字参数(**kwargs)
命名关键字参数( * )
函数当参数
def names(a, b, c=0, *args, *kwargs):
print('位置参数:',a) #>> 1
print('位置参数:',b) #>> 2
print('默认参数:',c) #>> 5
print('不定长参数:',args) #>> ('a', 'b')
print('关键字参数:',kwargs) #>> {'x': 9}
names(1,2,5,'a','b',x=9)
#----------------------------------------------------#
def names2(a,b,,name,age):
print('a:',a) #>>a: A
print('b:',b) #>>b: B
print('name:',name) #>> name: 张三
print('age:',age) #>> age: 17
names2('A',"B",name='张三',age=17)
#----------------------------------------------------#
def func(arg): arg()
def show(): pass
func(show) # 把函数当参数传递到func中
一个函数是一个作用域。
作用域规则:优先在自己的作用域中找数据,自己没有就去"父级"-> "父级" 查找一直到全局,全局在没有会报错。
全局变量(命名规范:大写)
局部变量(命名规范:小写)
注意:全局变量为不可变类型时,局部变量不能对全局变量进行直接修改;当全局变量为可变类型时,局部变量能对全局变量直接修改; 用关键字(global / nonlocal)声明后可以修改。
A = 0
def s():
A = 5 # 不能对全局变量修改,只能局部重新赋值
print('局部变量:',A) #>> 局部变量: 5
s()
print("全局变量:",A) #>> 全局变量: 0
#---------------------------------------------------------------#
A = []
def s():
A.append(5) # 这是对全局变量进行修改
print('局部变量:',A) #>> 局部变量: [5]
s()
print("全局变量:",A) #>> 全局变量: [5]
global 声明变量为全局变量,后可对全局变量修改。
nonlocal 只找上一级的作用域,后可对父级变量修改。
B = 10
def func():
B = 0
def s():
nonlocal B # 只针对上一级变量
B = 5 # 不能对全局变量修改,只能局部重新赋值
print('局部变量:',B) #>> 局部变量: 5
s()
func()
print("全局变量:",B) #>> 全局变量: 10
#---------------------------------------------------------------#
B = 10
def func():
B = 0
def s():
global B # 声明为全局变量
B = 5 # 同时修改全局变量
print('局部变量:',B) #>> 局部变量: 5
s()
func()
print("全局变量:",B) #>> 全局变量: 5
默认返回:None
特殊情况:
def func():
return 1,2,3,4
print(func()) # 返回一个元组格式
用于表示简单的函数。lambda函数内部隐藏了return方法,默认带返回值。
应用场景:闭包、函数式编程
def func1(a):
return a
# 上面和下面表达一致
func2 = lambda a: a # func2得到函数内存地址
func3 = lambda : 100 # 不带参数,直接返回100
python内部的函数:
计算相关
divmod(a,b) 两个数相除,返回商和余数两个值。
abs(num) 返回数据的绝对值
pow(x,y) 就幂运算,同2**3
a = 2**3
b = pow(2,3)
print(a,b) #>> 8 8
round(num) 将数字计算结果四舍五入到给定的精度(小数点后位数),默认不带小数点位
a = 0.35567
print(round(a, 2)) #>> 0.36
进制转换
a = bin(2) # 先转二进制 0b开头
print(int(a, base=2)) # 在转十进制
b = oct(8) # 先转八进制 0o开头
print(int(b, base=8)) # 在转十进制
c = hex(100) # 先转十六进制 0x开头
print(int(c, base=16)) # 在转十进制
编码转换
chr() 将十进制的数字转换成Unicode编码中的对应字符
print(chr(65)) #>> A
ord() 根据字符在Unicode编码中找到成对应的十进制数字
print(ord('A')) #>> 65
应用场景:
# 随机验证码
import random
def rand_data(lenth):
data = []
for i in range(length): # 控制验证码长度
v = random.randint(65,90) # 获取随机生成数字
data.append(chr(v)) # 将数字转换成对应的字符,添加到列表中
return ''.join(data)
print(rand_data(6)) # 输出转换后的字符
高级函数
map(x,y) x: 函数,y: 必须可迭代类型数据;循环y中每个元素,然后让每个元素执行x函数,将每个函数执行的结果保存到新列表中,并返回;使用结果需要 list 强制转换下结果或循环,可以得到对应的数据。
filter(x,y) x: 函数,y: 必须可迭代类型数据;通过x函数循环y列表,剔除不需要的元素,将函数执行的结果保存到新列表中,并返回;使用结果需要 list 强制转换下结果或循环,可以得到对应的数据。
reduce(x,y) x: 函数,y: 必须可迭代类型数据; 通过x函数循环操作(运算、拼接等) y 列表中每个元素,最终返回一个值。
a = [1,2,3,4]
result = map(lambda x:x+100, a) # 每个元素加100
print(result) #>>
b = [1,2,'a','b']
result = filter(lambda x:True if type(x)==int else False, b)
print(result) #>>
print(list(result)) #>> [1, 2]
#-------------------------------------------------------#
def func(x):
return True if type(x)==int else False
result = filter(func,b)
print(result) #>>
print(list(result)) #>> [1, 2]
#-------------------------------------------------------#
result = filter(lambda x: type(x)==int, b)
print(result) #>>
print(list(result)) #>> [1, 2]
import functools
c = [1,2,3,4,5]
def func(x,y):
return x+y
result = functools.reduce(func,c)
print(result) #>> 15
#-------------------------------------------------------#
result = functools.reduce(lambda x,y:x+y, c)
print(result) #>> 15
维基百科中的解释:
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外
父类函数中嵌套子类函数,子类函数引用父类函数的变量,并且父类函数return子类函数对象(内存地址)。
另一个解释:内层函数引用了外层函数的变量,然后返回内层函数的情况,成为闭包。
闭包必备条件:外函数有传递值 + 内层函数有使用
作用:在循环的过程中,将传递的值保存到内存中,以便于以后使用。
def func(name):
def inner():
print(name)
return inner
v = func('alex')
v()
例子:
info = []
def func(i):
def inner():
print(i)
return inner
for i in range(10):
info.append(func(i))
info[0]() #>> 0
info[4]() #>> 4
逻辑说明:1.程序从上往下开始执行,先执行for循环 i=0 ,i 的值传入函数 func 中,返回子函数 inner 的内存地址,添加到 info 列表中。
2.继续for循环 i=1 ,i 的值传入函数 func 中,返回子函数 inner 的内存地址,添加到 info 列表中;以此执行到 i=9 后,info 列表中已有9个 子函数 inner 的内存地址数据。
3.程序往下执行:info[0]() ,调用列表 info 中的第0索引的内存地址,并执行子函数 inner() 输出 i 值,由于子函数 inner 中没有 i 进行赋值需要从父函数中查找,把父函数的 i=0 值传入子函数中并输出:0
4.程序往下执行:info[4]() ,调用列表 info 中的第4索引的内存地址,并执行子函数 inner() 输出 i 值,由于子函数 inner 中没有 i 进行赋值需要从父函数中查找,把父函数的 i=4 值传入子函数中并输出:4
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
装饰器的作用就是为已经存在的函数或对象添加额外的功能。
装饰器标准语法格式:
def 外层函数(参数):
def 内层函数(*arg,**kwarg):
return 参数(*arg,**kwarg)
return 内层函数
@外层函数
def index(*arg,**kwarg):pass
index()
# 函数赋值示例:
def c(): print('11')
def d(): print('22')
d = c
d() #>> 11
#-----------------------------------------------------#
def func(arg): #2. arg=f1函数
def inner(): arg() #5. arg()=调用f1函数
return inner #3. 返回inner函数
def f1(): print('123') #6. 最后输出print
v1 = func(f1) #1. v1=inner函数
v1() #4. 执行inner函数
def func(arg):
def inner(): return arg()
return inner
def index():
print('123')
return '666'
#示例一:
v1 = index() # 执行inner函数,打印123并返回666赋值v1
#示例二:
v2 = func(index) # v2=inner函数,arg=index函数
index = 888 # index重新赋值
v3 = v2() # 还是执行inner函数,打印123并返回666赋值v3
#示例三:
v4 = func(index) # func返回inner函数内存地址,赋值给v4
index = v4 # v4中inner内存地址再赋值给index
index() # 执行inner函数,arg()在调用index(),最后print:123
def func(arg):
def inner():
print("添加内容一")
v = arg() # 这里arg还是指向原来的index函数
print("添加内容二")
return v
return inner
def index():
print('123')
return '666'
#示例四:
index = func(index) # 把index函数对象传入func函数的arg参数中,返回inner函数对象=index变量
index() # 因index变量已指向inner函数对象,所以index()执行的是inner函数
def func(arg):
def inner():
print("添加内容一")
v = arg() # 这里arg还是指向原来的index函数
return v
return inner
# @func 等价于 index = func(index)
#第一步:执行func函数并将下面的函数当参数传递;
#第二步:将func的返回值重新赋值给下面的函数名。
@func # 装饰器语法
def index():
print('123')
index()
# 带参数--装饰器示例:
def getsss(*args, **kwargs): # 接收参数
def c(ff): # 接收装饰的函数
def inner():
if args: # 条件成立,执行计算
return ff() + 100
else: # 条件成立,执行计算
return ff() + 200
return inner
return c
@getsss(True) # 传入参数
def func1():
return 10
@getsss(False)
def func2():
return 11
# 返回计算后的结果
print(func1())
print(func2())
列表推导式
列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表.
基本格式
result = [i for i in range(10)]
#------------------上下等同---------------#
r = []
for i in range(10):
r.append(i)
#示例一:
v1 = [i+100 for i in range(10)]
v2 = ['i大' if i>5 else 'i小' for i in range(10)]
v3 = [lambda :100 for i in range(1)]
v4 = [lambda :100+i for i in range(10)]
print(v44 #>> 109 #i只传递for循环最后一个值9,匿名函数中的i值永远都是9
#面试题:
v5 = [lambda x:x+i for i in range(10)]
#2.v50结果是什么? 11
#-----------------------------------------------#
def num():
return [lambda x:x*i for i in range(4)]
print(num()) # 输出4个lambda函数对象
print([m(2) for m in num()]) #>> [6,6,6,6]#循环函数对象,把实参2传递函数中,return结果
#------------------- 筛选 -------------------------#
v6 = [i for i in range(10) if i>5]
print(v6) #>> [6,7,8,9] #先执行for循环i=0,在if判断i的值为True则append:i值,依次循环。
字典推导式
同理列表,模板: { key:value for key,value in existing_data_structure }
strings = ['import','is','with','if']
dict = {k:v for v,k in enumerate(strings)}
print(dict) #>> {'import': 0, 'is': 1, 'with': 2, 'if': 3}
#--------------------keys和value互换------------------------------#
person = {'naem':'aaa','axg':18}
print(person.items()) #>>dict_items([('naem', 'aaa'), ('axg', 18)])
person_reverse = {v:k for k,v in person.items()}#也可以实现
print(person_reverse) #>>{'aaa': 'naem', 18: 'axg'}
集合推导式
同理列表,模板: { expression for item in Sequence if conditional }
names = [ 'Bob', 'JOHN', 'alice', 'bob' ]
new_names = {n[0].upper() + n[1:].lower() for n in names}
print(new_names) #>> {'Alice', 'Bob', 'John'}
递归:
官方规定:递归最大次数:1000
修改递归次数:sys.setrecursionlimit(999999999) # 不管数值多大,最多到20963次
递归的特点:
必须有一个明确的结束条件,要不就会变成死循环了,最终撑爆系统
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
递归执行效率不高,递归层次过多会导致栈溢出
import sys
sys.getrecursionlimit() #>> 返回递归最大值 int
def func(a): # 递归案例
if a ==5:
return 10000
result = func(a+1) +10 # 注意 func(a+1)调用循环次数
return result
v = func(1)
print(v) #>> 10040
####################### 未完待续 ################################
手机扫一扫
移动阅读更方便
你可能感兴趣的文章