计算机基本硬件由: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的字节码再编译成机器码。
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'>
>>> 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'
ss = 'abcd' # 两种不同的数据类型转换显示格式
print(str(s)) >>> abcd # 不带冒号
print(repr(s)) >>> 'abcd' # 带冒号
>>> s1 = 'hello'
>>> s2 = 'world'
>>> s1 + s2
'helloworld'
>>> s1 = 'abcd'
>>> s2 = '-'
>>> s2.join(s1)
'a-b-c-d'
>>> '*'.join(s1) # 可以指定符号(任意类型)进行拼接
'a*b*c*d'
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
'中国中国'
>>> s1 = 'Hello world'
>>> s2 = 'Python'
>>> s1.replace('world',s2)
'Hello Python'
>>> s1.replace('world','Python')
'Hello Python'
>>> s1 = " ab cd " # 删除空格,注意字符与字符之间的空格不会被删除
>>> s1.strip()
'abcd'
>>> s1.lstrip()
'abcd '
>>> s1.rstrip()
' abcd'
>>> s1 = "****ab**cd****" # 删除指定字符
>>> s1.strip("*")
'ab**cd'
>>> s1.lstrip("*")
'ab**cd****'
>>> s1.rstrip("*")
'****ab**cd'
>>> s = 'this is a title'
>>> s.title() #
'This Is A Title'
>>> s = 'abcdefg'
>>> s.upper()
'ABCDEFG'
>>> s = 'ABCDEFG'
>>> s.lower()
'abcdefg'
>>> s.islower()
False
>>> s.casefold()
'abcdefg'
>>> s = 'abcdefg'
>>> s.capitalize()
'Abcdefg'
>>> s = 'ABC def'
>>> s.swapcase()
'abc DEF'
>>> 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
>>> s = 'abcd1234'
>>> s.startswith('a')
True
>>> s.startswith('b')
False
>>> s.endswith('a')
False
>>> s.endswith('4')
True
>>> s = "this is string example....wow!!!"
>>> s.count('i') # 计算指定的字符,在目标字符串中有几个
3
>>> s.count('i',5,13) # 5,13 表示计算的范围
2
>>> s = "this is string example....wow!!!"
>>> len(s)
32
>>> 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 <module>
ValueError: substring not found
>>> 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
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 []
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]
tuple1 = ('aa', 1,1,1, 2, 'a', [33, 44], 'b', 11, 22)
tuple2 = (1,2,3,4,5,6,7)
# lists2 = ('a','b','c')
print(tuple1.index('b')) #>> 7
print(tuple1.count(1)) #>> 3
print(max(tuple2)) #>> 7 c
print(min(tuple2)) #> 1 a
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
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}
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}
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}
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}
s = {1}
s.add('a')
print(s) #>> {1, 'a'}
s2 = {11,22}
s.update(s2)
print(s) #>> {1, 11, 'a', 22}
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}
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:
语句体
for i in 条件:
语句体
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() # 关闭文件
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 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中
一个函数是一个作用域。
作用域规则:优先在自己的作用域中找数据,自己没有就去"父级"-> “父级” 查找一直到全局,全局在没有会报错。
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]
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
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
计算相关
a = 2**3
b = pow(2,3)
print(a,b) #>> 8 8
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)) # 在转十进制
编码转换
print(chr(65)) #>> A
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)) # 输出转换后的字符
高级函数
a = [1,2,3,4]
result = map(lambda x:x+100, a) # 每个元素加100
print(result) #>>
print(list(result)) #>> [101, 102, 103, 104]
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)]
# 变量 = [ for循环的变量 for循环一个可迭代对象]
#------------------上下等同---------------#
r = []
for i in range(10):
r.append(i)
#示例一:
v1 = [i+100 for i in range(10)]
# [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
v2 = ['i大' if i>5 else 'i小' for i in range(10)]
# ['i小', 'i小', 'i小', 'i小', 'i小', 'i小', 'i大', 'i大', 'i大', 'i大']
v3 = [lambda :100 for i in range(1)]
# [. at 0x000000000513A950>]
v4 = [lambda :100+i for i in range(10)]
print(v4[4]()) #>> 109 #i只传递for循环最后一个值9,匿名函数中的i值永远都是9
#面试题:
v5 = [lambda x:x+i for i in range(10)]
# 1. v5是什么? 10个函数对象
#2.v5[0](2)结果是什么? 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值,依次循环。
字典推导式
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'}
集合推导式
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
####################### 未完待续 ################################