author: UpDown published: True created: 2022年5月10日08点37分 tags: Done version: Outer
注释
- 单行:
#
多行:
'''
注释
'''
版本中文支持
python3中,是默认支持中文的,但是在python2中就需要一定的额外操作才可以
解决的办法为:在程序的开头写入如下代码,这就是中文注释#coding=utf-8
在python的语法规范中推荐使用的方式:# -*- coding:utf-8 -*-
变量
怎样知道一个变量的类型呢?
在python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了,不需要咱们开发者主动的去说明它的类型,系统会自动辨别
-
标识符
标识符由字母、下划线和数字组成,且数字不能开头
python中的标识符是区分大小写的命名规则
小驼峰式命名法(lower camel case): 第一个单词以小写字母开始;第二个单词的首字母大写,例如:myName、aDog
- 大驼峰式命名法(upper camel case): 每一个单字的首字母都采用大写字母,例如:FirstName、LastName
- 还有一种命名法是用下划线“_”来连接所有的单词,比如send_buf
Python的命令规则遵循PEP8标准,这个在后面会慢慢讲到。 PEP8规范:https://zhuanlan.zhihu.com/p/110405756
#1、变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。
#2、类中受保护的实例属性,应该以一个下划线开头。
#3、类中私有的实例属性,应该以两个下划线开头。
#4、类和异常的命名,应该每个单词首字母大写。
#5、模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。
#6、类的实例方法,应该把第一个参数命名为self以表示对象自身。
#7、类的类方法,应该把第一个参数命名为cls以表示该类自身。
私有化
- xx: 公有变量
- _x: 可以访问,但是不要轻易访问。按照约定俗成,当你看到这样的变量时,意思就是,“虽然我可以被访问,但请把我视为私有变量,不要随意访问。在导入的时候,from somemodule import *无法导入
- __xx:私有属性,双前置下划线,无法在外部直接访问(名字重整所以访问不到)
- xx:双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
- xx_:单后置下划线,用于避免与Python关键词的冲突
- 父类中属性名为__名字的,子类不继承,子类不能访问
- 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
- _名的变量、函数、类在使用from xxx import *时都不会被导入
print输出
print函数的格式控制:https://zhuanlan.zhihu.com/p/137534148
- 字符串连接法
- format匹配法
**print**("a的值为:{} b的值为:{} c的值为:{}"**.**format(a,b,c))
- 高级语法
**print** ("a的值为:{:4d} b的值为:{:4d} c的值为:{:4d}"**.**format(a,b,c))
c语言风格的输出
print("我今年%d岁" % age)
- print(“我的姓名是%s, 年龄是%d” % (name, age))
完全格式符号:https://blog.updown.world/articles/python/pythonbook/file/1/section.6.html
f 格式化字符串
print(f"nmb,{sb}")
高级语法:https://blog.csdn.net/ljr_123/article/details/119831860
input
password = input('请输入你的密码')
注意input() 输入的数据 都是字符串类型
运算符
https://blog.updown.world/articles/python/pythonbook/file/1/section.7.html
下面以a=10 ,b=20为例进行计算
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | 两个对象相加 a + b 输出结果 30 |
- | 减 | 得到负数或是一个数减去另一个数 a - b 输出结果 -10 |
* | 乘 | 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200 |
/ | 除 | b / a 输出结果 2 |
// | 取整除 | 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
% | 取余 | 返回除法的余数 b % a 输出结果 0 |
** | 指数 | a**b 为10的20次方, 输出结果 100000000000000000000 |
下图来源:https://blog.updown.world/articles/python/pythonbook/file/3/section.11.3.html
运算符 | Python 表达式 | 结果 | 描述 | 支持的数据类型 |
---|---|---|---|---|
+ | [1, 2] + [3, 4] | [1, 2, 3, 4] | 合并 | 字符串、列表、元组 |
* | [‘Hi!’] * 4 | [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] | 复制 | 字符串、列表、元组 |
in | 3 in (1, 2, 3) | True | 元素是否存在 | 字符串、列表、元组、字典 |
not in | 4 not in (1, 2, 3) | True | 元素是否不存在 | 字符串、列表、元组、字典 |
复合赋值运算符
如:
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
---|---|---|
数据类型转换
完全表:https://blog.updown.world/articles/python/pythonbook/file/1/section.10.html
函数 | 说明 |
---|---|
int(x) | 将x转换为一个整数 |
float(x ) | 将x转换为一个浮点数 |
str(x ) | 将对象 x 转换为字符串 |
repr(x ) | 将对象 x 转换为表达式字符串 |
eval(str ) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s ) | 将序列 s 转换为一个元组 |
list(s ) | 将序列 s 转换为一个列表 |
比较(关系)运算符
逻辑运算符
and
,or
,not
and | x and y | 布尔”与”:如果 x 为 False,x and y 返回 False,否则它返回 y 的值。 | True and False, 返回 False。 |
---|---|---|---|
or | x or y | 布尔”或”:如果 x 是 True,它返回 True,否则它返回 y 的值。 | False or True, 返回 True。 |
not | not x | 布尔”非”:如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not True 返回 False, not False 返回 True |
if判断
if 条件一成立:
执行语句...
elif 条件二成立:
执行语句...
elif 条件二成立:
执行语句...
elif 条件二成立:
执行语句...
else:
执行语句...
while循环
while 条件:
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
...(省略)...
i = 0
while i < 10000:
print("WDNMD")
i += 1
案例:九九乘法表:
i = 1
while i<=9:
j=1
while j<=i:
print("%d*%d=%-2d " % (j, i, i*j), end = '')
j+=1
print('\n')
i+=1
案例:倒三角
i = 1
while i <= 5:
j = 1
while j <= i:
print("* ", end = '')
j += 1
print("\n")
i += 1
*
* *
* * *
* * * *
* * * * *
```
<a name="q8Xad"></a>
### for循环
在Python中 for循环可以遍历任何序列的项目,如一个列表或者一个字符串等。
```python
for 临时变量 in 列表或者字符串等可迭代对象:
循环满足条件时执行的代码
range(5)
for i in range(5):
print(i)
break/continue
- break的作用:立刻结束break所在的循环
continue的作用:用来结束本次循环,紧接着执行下一次的循环,相当于跳过了当前这次循环
break/continue只能用在循环中,除此以外不能单独使用
break/continue在嵌套循环中,只对最近的一层循环起作用
字符串
-
下标
列表与元组支持下标索引好理解,字符串实际上就是字符的数组,所以也支持下标索引
方法
字符串方法
https://blog.updown.world/articles/python/pythonbook/file/3/section.4.2.html
find
检测 str 是否包含在 mystr中,如果是返回开始的索引值,否则返回-1mystr.find(str, start=0, end=len(mystr)) # 方法介绍
mystr = 'hello world halon and halonge'
pos1 = mystr.find('halon')
print(pos1) # 12
index
跟find()方法一样,只不过如果str不在 mystr中会报一个异常.mystr.index(str, start=0, end=len(mystr))
count
返回 str在start和end之间 在 mystr里面出现的次数mystr.count(str, start=0, end=len(mystr))
str01 = 'hello world hello world'
# 获取字符串'o'在str01里的次数
count01 = str01.count('o')
print(count01) # 4
# 获取字符串'hello'在str01里的次数
count02 = str01.count('hello')
print(count02) # 2
replace
把 mystr 中的 str1 替换成 str2,如果 count 指定,则替换不超过 count 次.mystr.replace(str1, str2, count)
str01 = 'hello world xiaoming and xiaoming'
# 把字符串str01里的xiaoming 变成xiaohong,最后结果赋值给str02
str02 = str01.replace('xiaoming', 'xiaohong')
# 注意 原字符串str01是不变的
print(str01) # hello world xiaoming and xiaoming
print(str02) # hello world xiaohong and xiaohong
split
以 seq为分隔符对字符串mystr分隔,如果 maxsplit有指定值,则仅分隔 maxsplit 个子字符串, 最后的结果存放到列表里mystr.split(seq, maxsplit)
str01 = '2018-01-01'
# 用指定字符串 把str01 拆分成多个数据,存放到一个数组里
list01 = str01.split('-')
# 注意原字符串str01 不会改变
print(str01) # 2018-01-01
print(list01) # ['2018', '01', '01']
如果split不指定分隔符,那么默认就是用空格分隔,如下
str01 = 'hello ha ha he he world\t python'
list01 = str01.split()
print(list01) # ['hello', 'ha', 'ha', 'he', 'he', 'world', 'python']
注意如果分隔符在字符串左侧或者右侧,结果会多出空字符串,效果如下
str01 = 'hello ha ha he he'
list01 = str01.split('he')
print(list01) # ['', 'llo ha ha ', ' ', '']
可以指定分隔的次数 如下
str01 = '2018-01-02-03-04'
# 只分隔前两次的分隔符
list01 = str01.split('-',2)
print(list01) # ['2018', '01', '02-03-04']
join
mystr 中每个元素后面插入str,构造出一个新的字符串mystr.join()
str01 = '-'
list01 = ['hello', 'world', 'python', 'is', 'good']
str02 = str01.join(list01)
print(str02) # hello-world-python-is-good
encode
str.encode(encoding='utf-8', errors="strict")
其中的encoding是指在解码编码过程中使用的编码(此处指“编码方案”是名词),errors是指错误的处理方案
decode
其余方法
- capitalize:把字符串的第一个字符大写
- title: 把字符串的每个单词首字母大写
- startswith:检查字符串是否是以 hello 开头, 是则返回 True,否则返回 False
print(str01.startswith('hello')) # True
- endswith:检查字符串是否以obj结束,如果是返回True,否则返回 False.
- lower:转换所有大写字符为小写
- upper: 转换的小写字母为大写
ljust: 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
mystr.ljust(width)
str01 = 'hello' str02 = str01.ljust(10) # 注意效果 end指定的字符串的位置 print(str02, end='-') # 'hello -'
rjust: 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
- center: 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
- lstrip: 删除 mystr 左边的空白字符
mystr.lstrip()
- rstrip: 删除 mystr 字符串末尾的空白字符
- strip:删除mystr字符串两端的空白字符(包括\n\t)
- rfind: 类似于 find()函数,不过是从右边开始查找
- rindex: 类似于 index(),不过是从右边开始
partition: 把mystr以str分割成三部分,str前,str和str后
mystr.partition(str)
str01 = 'hello world halon and halonge' t1 = str01.partition('halon') print(t1) # ('hello world ', 'halon', ' and halonge')
rpartition: 类似于 partition()函数,不过是从右边开始.
splitlines: 按照行分隔,返回一个包含各行作为元素的列表
mystr.splitlines()
str01 = 'hello\nworld' print(str01) str02 = str01.splitlines() print(str02)
isalpha: 如果 mystr 所有字符都是字母 则返回 True,否则返回 False
- isdigit: 如果 mystr 只包含数字则返回 True 否则返回 False.
- isalnum: 如果 mystr 所有字符都是字母或数字则返回 True,否则返回 False
- isspace: 如果 mystr 中只包含空格,则返回 True,否则返回 False.
切片
各种语法:https://blog.updown.world/articles/python/pythonbook/file/3/section.4.html
切片是指对操作的对象截取其中一部分的操作。字符串、列表、元组都支持切片操作。
切片的语法:[起始:结束:步长]
注意:选取的区间从”起始”位开始,到”结束”位的前一位结束(不包含结束位本身),步长表示选取间隔。
反切:print(a[6:0:-2]) # 步长是负数 从右向左取 注意起始下标和结束下标也要从右向左
列表
与c语言不同,python列表中的元素可以是不同类型的
namesList = ['xiaoWang','xiaoZhang','xiaoHua']
print(namesList[0])
for循环列表
names = ["张三", "李四", "王六", 'halon', '小马哥']
for name in names:
print(name)
'''
张三
李四
王六
halon
小马哥
'''
修改元素的时候,要通过下标来确定要修改的是哪个元素,然后才能进行修改
查找元素
in, not in
- in(存在),如果存在那么结果为true,否则为false
- not in(不存在),如果不存在那么结果为true,否则false
列表操作
append
通过append可以向列表添加元素names.append('nmb')
extend
通过extend可以将另一个集合中的元素逐一添加到列表中
list01 = [1, 2]
list02 = [3, 4]
list01.append(list02)
print('append效果---查看list01----%s' % list01)
list01.extend(list02)
print('extend效果---查看list01----%s' % list01)
"""
append效果---查看list01----[1, 2, [3, 4]]
extend效果---查看list01----[1, 2, [3, 4], 3, 4]
"""
insert
insert(index, object) 在指定位置index前插入元素object
list01 = [0, 1, 2, 3, 4]
# 在列表的索引为一的位置 添加一个元素
list01.insert(1, 3)
# 打印输出添加后的效果
print(list01) # 结果是 [0, 3, 1, 2, 3, 4]
index, count
del
根据下标进行删除del movieName[2]
del VS delattr()
- 动态删除:del是更明确和有效的,并且delattr()允许动态属性删除。
- Speed:如果考虑并运行以上程序,则执行速度之间会有细微差别。与delattr()相比,del稍快一些,具体取决于机器。
- 字节码说明:与delattr()相比,del还占用更少的字节码指令。
因此,我们通过说del比delattr快一点来结束比较,但是当涉及到属性的动态删除时,delattr()具有优势,因为del运算符无法实现。
pop
remove
根据元素的值进行删除movieName.remove('指环王')
sort
方法是将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小。a.sort()
a.sort(reverse=True)
reverse
元组
不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。aTuple = ('et',77,99.9)
tuple[0]
获取元组中的元素
count, index
字典
info = {'name':'班长', 'id':100, 'sex':'f', 'address':'地球亚洲中国北京'}
- 字典的每个元素由2部分组成,键:值。例如 ‘name’:’班长’ ,’name’为键,’班长’为值
info['name']
通过键访问值在我们不确定字典中是否存在某个键而又想获取其值时,可以使用get方法,还可以设置默认值:
>>> age = info.get('age') >>> age #'age'键不存在,所以age为None >>> type(age) <type 'NoneType'> >>> age = info.get('age', 18) # 若info中不存在'age'这个键,就返回默认值18 >>> age 18
字典的每个元素中的数据是可以修改的,只要通过key找到,即可修改
info['id'] = int(new_id)
如果在使用 变量名[‘键’] = 数据 时,这个“键”在字典中,不存在,那么就会新增这个元素。in
in在对字典操作时,判断的是字典的键
>>> 'itc' in 'hello itcast' True >>> 3 in [1, 2] False >>> 4 in (1, 2, 3, 4) True >>> "name" in {"name":"Delron", "age":24} True
遍历
通过for … in … 我们可以遍历字符串、列表、元组、字典等 ```python dict01 = {‘name’: ‘张三’, ‘age’: 18, ‘sex’: ‘m’} for key in dict01.keys(): print(key)
结果: name age sex
```python
dict01 = {'name': '张三', 'age': 18, 'sex': 'm'}
for key, value in dict01.items():
print('%s--%s' % (key, value))
结果:
name--张三
age--18
sex--m
字典操作
del
del info['name']
: 删除指定的元素del info
: 删除整个字典
clear
len()
keys
返回一个包含字典所有KEY的列表
dict01 = {'name': '张三', 'age': 18, 'sex': 'm'}
keys = dict01.keys()
print(keys) # ['name', 'age', 'sex']
values
返回一个包含字典所有value的列表
dict01 = {'name': '张三', 'age': 18, 'sex': 'm'}
values = dict01.values()
print(values) # ['张三', 18, 'm']
items
返回一个包含所有(键,值)元祖的列表
dict01 = {'name': '张三', 'age': 18, 'sex': 'm'}
items = dict01.items()
print(items) # [('name', '张三'), ('age', 18), ('sex', 'm')]
enumerate()
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>> chars = ['a', 'b', 'c', 'd']
>>> for i, chr in enumerate(chars):
... print("%d %s"%(i, chr))
...
0 a
1 b
2 c
3 d
内置函数(内建函数)
方法 | 描述 |
---|---|
cmp(item1, item2) | 比较两个值 |
len(item) | 计算容器中元素个数 |
max(item) | 返回容器中元素最大值 |
min(item) | 返回容器中元素最小值 |
del(item) | 删除变量 |
cmp
>>> cmp("hello", "itcast")
-1
>>> cmp("itcast", "hello")
1
>>> cmp("itcast", "itcast")
0
>>> cmp([1, 2], [3, 4])
-1
>>> cmp([1, 2], [1, 1])
1
>>> cmp([1, 2], [1, 2, 3])
-1
>>> cmp({"a":1}, {"b":1})
-1
>>> cmp({"a":2}, {"a":1})
1
>>> cmp({"a":2}, {"a":2, "b":1})
-1
len
>>> len("hello itcast")
12
>>> len([1, 2, 3, 4])
4
>>> len((3,4))
2
>>> len({"a":1, "b":2})
2
max
>>> max("hello itcast")
't'
>>> max([1,4,522,3,4])
522
>>> max({"a":1, "b":2})
'b'
>>> max({"a":10, "b":2})
'b'
>>> max({"c":10, "b":2})
'c'
del
del有两种用法,一种是del加空格,另一种是del()
>>> a = 1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> a = ['a', 'b']
>>> del a[0]
>>> a
['b']
>>> del(a)
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
map
map函数会根据提供的函数对指定序列做映射
a = map(lambda x: x*x, [1, 2, 3])
b = map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6])# 多参数的情况
# for i in b:
# print(i)
for i in a:
print(i)
print(b)
print(a)
"""
1
4
9
<map object at 0x0000028474BD3E50>
<map object at 0x0000028474BD3EE0>
"""
将lambda改为普通函数
与之前的1个案例,很类似,仅仅是将函数由之前使用的匿名函数改为了def定义的函数而已,其他运行过冲没有差异
def f1( x, y ):
return (x,y)
l1 = [ 0, 1, 2, 3, 4, 5, 6 ]
l2 = [ 'Sun', 'M', 'T', 'W', 'T', 'F', 'S' ]
l3 = map( f1, l1, l2 )
print(list(l3))
# 结果为:[(0, 'Sun'), (1, 'M'), (2, 'T'), (3, 'W'), (4, 'T'), (5, 'F'), (6, 'S')]
filter
filter函数会对指定序列执行过滤操作
- function:接受一个参数,返回布尔值True或False
- sequence:序列可以是str,tuple,list等
```python
filter(lambda x: x%2, [1, 2, 3, 4])
[1, 3]
filter(None, “she”)
‘she’
<a name="xdwol"></a>
#### reduce
reduce函数会对参数序列中元素进行重复操作<br />reduce函数依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function<br />在Python3里, reduce函数已经被放置在fucntools模块里用的话要先引入: from functools import reduce
```python
reduce(lambda x, y: x+y, [1,2,3,4])
10
reduce(lambda x, y: x+y, [1,2,3,4], 5)
15
reduce(lambda x, y: x+y, ['aa', 'bb', 'cc'], 'dd')
'ddaabbcc'
函数
来源:https://blog.updown.world/articles/python/pythonbook/file/4/README-2.html
def 函数名():
代码
函数名() # 调用
- 每次调用函数时,函数都会从头开始执行,当这个函数中的代码执行完毕后,意味着调用结束了
- 当然了如果函数中执行到了return也会结束函数
函数文档
```python def sum_2_num(a, b): “”” 求两个数的和 :param a:参数一 :param b:参数二 :return:返回result 两个数的和 “”” result = a + b return result
sum_2_num(2,3)
`help(sum_2_num)`
<a name="mZgiv"></a>
#### 传参
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”
- 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
1. 位置参数 : `def print_info(name, age):`
1. 可变参数(不定长参数):`def sum_nums(a, b, c=0, *args):`
- 加了星号(*)的变量args会存放所有未命名的变量参数,args为元组
```python
def sum_nums(a, b, c=0, *args):
result = a+b+c
print("-"*10)
print(a)
print(b)
print(c)
print(args)
print(result)
sum_nums(11, 22)
sum_nums(11, 22, 33)
- 关键字参数(**kwargs)
- 变量**kwarg会存放key=value的参数, kwargs为字典.
- 变量kwarg必须放在所有参数的最右侧 ```python def sum_nums(a, b=11, c=22, *args, kwargs): print(a) print(b) print(c) print(args) print(kwargs)
sum_nums(100, 200, 300, 400, 500, 600, d=3.14, age=18)
“”” 100 200 300 (400, 500, 600) {‘d’: 3.14, ‘age’: 18} “””
- `def print_info(name, age=18):`在形参中默认有值的参数,称之为缺省参数
- **注意:缺省参数一定要位于位置参数的后面**
- 缺省参数在*args后面`def sum_nums_3(a, *args, b=22, c=33):`
- <br />
<a name="Mj1aj"></a>
#### 作用域
- 局部变量,就是在函数内部定义的变量
- 其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的
- 当函数调用时,局部变量被创建,当函数调用完成后这个变量就不能够使用了
<a name="SzsIN"></a>
#### 全局变量和局部变量名字相同问题
- 如果在函数中出现global 全局变量的名字 那么这个函数中即使出现和全局变量名相同的变量名 = 数据 也理解为对全局变量进行修改,而不是定义局部变量
- 如果在一个函数中需要对多个全局变量进行修改,那么可以使用
```python
def fucku():
# 可以使用一次global对多个全局变量进行声明
global a, b
# 还可以用多次global声明都是可以的
# global a
# global b
多个return
- 一个函数中可以有多个return语句,但是只要有一个return语句被执行到,那么这个函数就会结束了,因此后面的return没有什么用处
如果程序设计为如下,是可以的因为不同的场景下执行不同的return
一个函数返回多个数据的方式
https://blog.updown.world/articles/python/pythonbook/file/4/section.8.4.html
return后面可以是元组,列表、字典等,只要是能够存储多个数据的类型,就可以一次性返回多个数据
- 如果return后面有多个数据,那么默认是元组
多个数据逗号分隔,默认是元组
m = 1, 2, 3
print(m) # (1, 2, 3)
返回的数据直接拆包
- 拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常
- 除了对元组拆包之外,还可以对列表、字典等拆包 ```python def get_my_info(): high = 178 weight = 100 age = 18 return high, weight, age
result = get_my_info()
print(result)
my_high, my_weight, my_age = get_my_info() print(my_high) print(my_weight) print(my_age)
```python
# a, b = (11, 22)
a, b = 11, 22
print(a)
print(b)
a, b = [11, 22]
print(a)
print(b)
a, b = {"m": 11, "n": 22} # 取出来的是key,而不是键值对
print(a) #m
print(b) #n
引用当做实参
- Python中函数参数是引用传递(注意不是值传递)
- 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身
- 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量
```python
def test1(b): # 变量b一定是一个局部变量,就看它指向的是谁?可变还是不可变
b += b # += 是直接对b指向的空间进行修改,而不是让b指向一个新的
b = b+b # xx = xx+yyy 先把=号右边的结果计算出来,然后让b指向这个新的地方,不管原来b指向谁
# 现在b一定指向这个新的地方
a = [11, 22]
a = 100 test1(a) print(a)
<a name="Ynolj"></a>
### function.__name__
获取函数名
```python
def sb():
pass
print(sb.__name__) # sb
交换2个变量的值
# 第4种方式
a, b = 4, 5
a, b = b, a
id
id(a)
在python中,值是靠引用来传递来的
>>> a = 1
>>> b = a
>>> id(a)
13033816
>>> id(b) # 注意两个变量的id值相同
13033816
可变、不可变类型
- 所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变
- 可变类型有: 列表、字典、集合
-
eval()函数
可以传入指定字符串作为参数,如果字符串里是一个有效的表达式,就会被执行
a = 10 str01 = 'a + 20' print(str01) print(eval(str01)) # 'a+20' -----> a+20
把字符串转成对应的类型
str01 = '123' num1 = int(str01) print(type(num1)) print(num1)
还可以用eval来实现
num2 = eval(str01) print(type(num2)) print(num2)
lambda 匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
Lambda函数能接收任何数量的参数但只能返回一个表达式的值
匿名函数不能直接调用print,因为lambda需要一个表达式 ```python sum = lambda arg1, arg2: arg1 + arg2
调用sum函数
print(“Value of total : “ % sum( 10, 20 )) print(“Value of total : “% sum( 20, 20 ))
<a name="hYen0"></a>
#### 应用场景
1. 自己定义函数
```python
>>> def fun(a, b, opt):
... print("a = " % a)
... print("b = " % b)
... print("result =" % opt(a, b))
...
>>> fun(1, 2, lambda x,y:x+y)
a = 1
b = 2
result = 3
- 作为内置函数的参数
数组中对象排序
```python stus = [ {“name”: “zhangsan”, “age”: 18}, {“name”: “lisi”, “age”: 19}, {“name”: “wangwu”, “age”: 17} ]
按name排序:
stus.sort(key = lambda x: x[‘name’]) stus [{‘age’: 19, ‘name’: ‘lisi’}, {‘age’: 17, ‘name’: ‘wangwu’}, {‘age’: 18, ‘name’: ‘zhangsan’}]
按age排序:
stus.sort(key = lambda x: x[‘age’]) stus [{‘age’: 17, ‘name’: ‘wangwu’}, {‘age’: 18, ‘name’: ‘zhangsan’}, {‘age’: 19, ‘name’: ‘lisi’}] ```
sys
给程序传参数 ```python import sys
print(sys.argv)
<a name="IScdX"></a>
### range
python中 range() 函数可创建一个整数列表,一般用在 for 循环中
- **注意:range函数在python2和python3中有些区别**
- 在python2返回的是一个列表在python3中返回的是一个**迭代器** ,大家可以当做一个列表来使用,关于迭代器后面高级知识中讲解
```python
range(start, stop[, step])
start: 计数从 start 开始。默认是从 0 开始
stop: 计数到 stop 结束,但不包括 stop
step:步长,默认为1
>>> range(0,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(2,9)
[2, 3, 4, 5, 6, 7, 8]
>>> range(10) # 如果从0开始 那么0可以省略
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(0,20,3) #注意步长
[0, 3, 6, 9, 12, 15, 18]
>>> range(0,30,5) #注意步长
[0, 5, 10, 15, 20, 25]
负数也可以,注意:如果 如果开始比结束的数字小,那么步长也要是负值
>>> range(5,-10,-1)
[5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0,-20,-3)
[0, -3, -6, -9, -12, -15, -18]
list01 = [0, 1, 2, 3, 4, 5]
# 遍历列表
for item in list01:
print(item)
print('-------------------')
# 也可以这样
for item in range(0, 6):
print(item)
列表推导式
多个for循环
set 集合
s01 = {1, 2, 3, 4, 5}
print(type(s01))
- 怎么创建空集合 ```python s01 = {} print(type(s01)) # 字典
s02 = {1, 2, 3} print(type(s02)) # 集合
创建空的集合
s03 = set() print(type(s03))
2. 不允许元素重复
<a name="qo52I"></a>
#### set、list、tuple之间可以相互转换
```python
# 定义一个列表
list01 = [11, 22, 33, 55, 77]
# 列表转元组
t01 = tuple(list01)
print(t01)
# 列表转集合
s01 = set(list01)
print(s01)
# 元组转集合
s01 = set(t01)
print(s01)
# 集合转列表
list02 = list(s01)
print(list02)
使用set,可以快速的完成对list中的元素去重复的功能
list01 = [11, 4, 22, 3, 33, 55, 6, 77, 22, 55, 11, 3]
s01 = set(list01)
print(s01) # {33, 3, 4, 6, 11, 77, 22, 55}