python3 入门知识(难点、语法糖、备忘)内容
循环中的else
一、while...else...
1. 格式
while 条件:
# 条件满足时执行的代码...
else:
# 如果上述的while循环没有调用break,就执行的代码...
说明:
- 只要while循环体中没有执行break,那么当while循环体中所有的代码执行完后,else中的代码也会执行
- 如果while循环中有break那么表示整个while介绍,else中的代码也不会被执行
2. 示例
有break时
i = 1
while i <= 3:
print("哈哈,我是超神,double kill......")
if i == 1:
print("调用了break")
break
i += 1
else:
print("我是else中的代码")
运行结果
哈哈,我是超神,double kill......
调用了break
没有break时
i = 1
while i <= 3:
print("哈哈,我是超神,double kill......")
i += 1
else:
print("我是else中的代码")
运行结果
哈哈,我是超神,double kill......
哈哈,我是超神,double kill......
哈哈,我是超神,double kill......
我是else中的代码
3. 案例
i = 3
while i > 0:
password = input("请输入密码:(还剩%d次机会)" % i)
if password == "123456":
print("密码输入正确")
break
i -= 1
else:
print("密码输入3次全部错误,请明日再试")
三、for...else...
1. 格式
for 变量 in 可迭代对对象:
# 正常执行的代码
else:
# for未使用break时执行的代码
2. 示例
未使用break
for i in range(5):
print("i=%d" % i)
else:
print("我是else中的代码...")
运行结果:
i=0
i=1
i=2
i=3
i=4
我是else中的代码....
使用break
for i in range(5):
print("i=%d" % i)
if i == 1:
print("我是break哦...")
break
else:
print("我是else中的代码...")
运行结果:
i=0
i=1
我是break哦...
3. 案例
for i in range(3, 0, -1):
password = input("请输入密码:(还剩%d次机会)" % i)
if password == "123456":
print("密码输入正确")
break
else:
print("密码输入3次全部错误,请明日再试")
字符串切片
一、是什么
较为官方的说法:切片是指对操作的对象截取其中一部分的操作
通俗来说:一种能够从数据中取到一部分数据的方式
例如,
有一个字符串"abcdef"
,我们可以通过切片取到"cde"
切片不仅可以在字符串中应用,还可以对列表、元组等进行操作,简言之“切片”功能很重要。
本节课我们以字符串为例讲解“切片”
二、怎样用
1. 语法
[起始:结束:步长]
注意
- 选取的区间从"起始"位开始,到"结束"位的前一位结束(不包含结束位本身),步长表示选取间隔
- 默认“步长”为1,即取完一个下标的数据之后,第二个下标的是在刚刚下标基础上+1
- 步长为正数,表示从左向右取数据
- 步长为负数,表示从右向左取数据
2. 示例
demo1
name = 'abcdef'
print(name[0:3]) # 取下标为0、1、2的字符,注意取不到下标为3的空间
运行结果:
abc
推导式
一、是什么
推导式:就是一种能够快速生成数据的方式
例如,想要快速生成由1~20内所有奇数数组成的列表,就可以用"推导式",代码如下
[x for x in range(1, 21) if x % 2 == 0]
运行结果如下:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
二、分类
推导式,根据最终要生成的数据,简单划分为
- 列表推导式
- 集合推导式
- 字典推导式
注意:
没有元组推导式,而是生成器(在Python高级进阶课程中在学习)
三、列表推导式
列表推导式:一种可以快速生成列表的方式
1. 格式
[变量 for 变量 in 可迭代对象]
四、集合推导式
集合推导式:一种快速生成集合的方式
示例:
In [5]: a = {x for x in range(1, 21) if x % 2 == 0}
In [6]: type(a)
Out[6]: set
In [7]: a
Out[7]: {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
集合推导式中也可以用if
等,与列表推导式在格式上很类似,这里就不做过多的介绍,请类别列表推导式进行学习
五、字典推导式
字典推导式:一种快速生成字典的方式
示例1:
快速生成一个1~10内key为某个数此时value为平方的字典
{x:x**2 for x in range(1, 11)}
拆包
一、是什么
拆包:是一种快速提取数据的方式
例如,有一个元组(11, 22, 33, 44)
想快速的提取每个元素且赋值给num1, num2, num3, num4
这4个变量
普通的做法,较为繁琐
nums = (11, 22, 33, 44) # 定义一个元组
num1 = nums[0] # 通过下标来提取
num2 = nums[1] # 通过下标来提取
num3 = nums[2] # 通过下标来提取
num4 = nums[3] # 通过下标来提取
拆包的方式,可以见非常简洁
num1, num2, num3, num4 = (11, 22, 33, 44) # 一行代码搞定
二、拆列表
示例
a, b = [11, 22]
print(a)
print(b)
运行结果:
11
22
三、拆元组
示例
a, b = (11, 22)
print(a)
print(b)
运行结果:
11
22
四、拆集合
示例
a, b = {11, 22}
print(a)
print(b)
运行结果:
11
22
五、拆字典
1. 一般用法
示例
a, b = {"name": "王老师", "web_site": "http://www.codetutor.top"}
print(a)
print(b)
运行结果:
name
web_site
默认取到的是字典的key,而不是value
六、注意点
=
右边要拆的数据元素的个数 要 与=
左边存的变量个数相同
错误示例如下:
a, b = [11, 22, 33]
函数参数高级用法
一、缺省参数
1. 是什么
缺省参数也叫做默认参数,是指定义函数时形参变量有默认值,如果调用函数时没有传递参数,那么函数就用默认值,如果传递了参数就用传递的那个数据
2. 做什么
当调用函数时,有些参数不必传递,而是用默认值,这样的场景往往都用缺省参数
例如,一个学校现在开始检查每个学生的信息,学生说:报告老师我是xxx学校xxx系xxx年级xxx班学生,名字叫xxxx,大家想只要是这学校的学生那么“xxx学校”就可以省略不用说了,因为大家都知道。所以就可以认为默认的学校就是xxx,而当其他学校的学生介绍时yyy学校名字案例说就一定要说清楚,否则让人弄混了
来个demo试试看
def print_info(name, class_name, grade, department_name, school_name="通俗易懂"):
print("老师好:我是来自 %s学校 %s系 %s年级 %s班级 的学生,我叫%s" % (
school_name,
department_name,
grade,
class_name,
name
))
print_info("dong", "超牛", "二", "软件工程")
print_info("dong", "超牛", "二", "软件工程", "codetutor.top")
运行结果
老师好:我是来自 通俗易懂学校 软件工程系 二年级 超牛班级 的学生,我叫dong
老师好:我是来自 codetutor.top学校 软件工程系 二年级 超牛班级 的学生,我叫dong
3. 注意点
- 缺省参数只能在形参的最后(即最后侧)
- 缺省参数全挨在一起(在右侧),不是缺省参数挨在一起(在左侧)
>>> def printinfo(name, age=35, sex):
... print name
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
二、命名参数
1. 是什么
命名参数是指:在调用函数时,传递的实参带有名字,这样的参数叫做命名参数
2. 做什么
命名参数能够在调用函数的时候,不受位置的影响,可以给需要的参数指定传递数据
3. 注意点
- 命名参数的名字要与形参中的名字相同,不能出现命名参数名字叫做
num
,而形参中没有变量num
- 如果形参左侧有普通的形参,调用函数时传递的参数一定要先满足这些形参,然后再根据需要编写命名参数
def test(a, b, c=100, d=200):
print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))
# 下面的方式都成功
test(11, 22)
test(11, 22, 33)
test(11, 22, 33, 44)
test(11, 22, d=33, c=44)
# 下面的方式都失败
test(c=1, d=2) # 缺少a、b的值
test(c=1, d=2, 11, 22) # 11, 22应该在左侧
三、不定长参数
1. 是什么
不定长参数:定义函数的时候形参可以不确定到底多少个,这样的参数就叫做不定长参数
不定长参数有2种方式表示
*args
:表示调用函数时多余的未命名参数都会以元组的方式存储到args
中**kwargs
:表示调用函数时多余的命名参数都会以键值对的方式存储到kwargs
中
注意:
*
和**
是必须要写的,否则就变成了普通的形参了- 当我们说不定长参数的时候,就是指
*args
和**kwargs
2. 做什么
通过不定长参数,能够实现调用函数时传递实参个数可以随意变换的需求
例如
def test(a, b, *args, **kwargs):
print("-------------------------------")
print(a, type(a))
print(b, type(b))
print(args, type(args))
print(kwargs, type(args))
test(11, 22)
test(11, 22, 33, 44, 55, 66)
test(11, 22, 33, 44, 55, 66, name="wanglaoshi", web_site="http://www.codetutor.top")
运行结果:
-------------------------------
11 <class 'int'>
22 <class 'int'>
() <class 'tuple'>
{} <class 'tuple'>
-------------------------------
11 <class 'int'>
22 <class 'int'>
(33, 44, 55, 66) <class 'tuple'>
{} <class 'tuple'>
-------------------------------
11 <class 'int'>
22 <class 'int'>
(33, 44, 55, 66) <class 'tuple'>
{'name': 'wanglaoshi', 'web_site': 'http://www.codetutor.top'} <class 'tuple'>
3. 注意点
- 加了星号
*
的变量args
会存放所有未命名的变量参数,args
为元组 - 而加
**
的变量kwargs
会存放命名参数,即形如key=value
的参数,kwargs
为字典 - 一般情况下
*args
、**kwargs
会在形参的最右侧 args
与kwargs
的名字可以变,例如叫*aa
,**bb
都是可以,但一般为了能够让其他的开发者快速读懂我们的代码最好还是不改
4. 特殊情况
缺省参数在*args
后面
def sum_nums_3(a, *args, b=22, c=33, **kwargs):
print(a)
print(b)
print(c)
print(args)
print(kwargs)
sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)
说明:
*args
后可以有缺省参数,想要给这些缺省参数在调用时传递参数,需要用命名参数传递,否则多余的未命名参数都会给args
- 如果有
**kwargs
的话,**kwargs
必须是最后的
通过*
、**
拆包
一、引入
假如有函数
def test(a, b, c):
print(a + b + c)
现在自己拥有的数据
nums = [11, 22, 33]
怎样养才能在调用test
函数的时候,将nums
给传递过去呢?
def test(a, b, c):
print(a + b + c)
nums = [11, 22, 33]
test(nums[0], nums[1], nums[2])
上述代码用的方式虽然能行,但不是很简洁
为了能够用更加简洁的方式实现上述场景需求,Python可以通过*
、**
将数据拆包后传递
二、使用*
拆包
有时在调用函数时,这个函数需要的是多个参数,而自己拥有的是一个列表或者集合这样的数据,此时就用可以用*
拆包
使用方式
*列表
*元组
*集合
用*
拆包的方式实现上述功能
def test(a, b, c):
print(a + b + c)
nums = [11, 22, 33]
test(*nums) # 此时的*的作用就是拆包,此时*nums相当于11, 22, 33 即test(11, 22, 33)
当是元组时依然可以拆
def test(a, b, c):
print(a + b + c)
nums = (11, 22, 33)
test(*nums)
当时集合是也是可以拆的
def test(a, b, c):
print(a + b + c)
nums = {11, 22, 33}
test(*nums)
注意:
*
对列表、元组、集合可以拆包,但一般都是在调用函数时用
三、使用**
拆包
使用**
可以对字典进行拆包,拆包的结果是命名参数
例如
def test(name, web_site, age):
print(name)
print(web_site)
print(age)
info = {
"name": "王老师",
"web_site": "www.codetutor.top",
"age": 18
}
test(**info)
四、难点
1. 疑惑点
学习不定长参数时,掌握了*args
、**kwargs
现在学习拆包时,也用到了*
、**
那它们之间有什么关系呢?
答:没有任何关系,只是长得像罢了
2. 示例
def test1(*args, **kwargs):
print("----在test1函数中----")
print("args:", args)
print("kwargs", kwargs)
def test2(*args, **kwargs):
print("----在test2函数中----")
print("args:", args)
print("kwargs", kwargs)
test1(args, kwargs)
test2(11, 22, 33, name="王老师", age=18)
运行结果
----在test2函数中----
args: (11, 22, 33)
kwargs {'name': '王老师', 'age': 18}
----在test1函数中----
args: ((11, 22, 33), {'name': '王老师', 'age': 18})
kwargs {}
3. 示例2
def test1(*args, **kwargs):
print("----在test1函数中----")
print("args:", args)
print("kwargs", kwargs)
def test2(*args, **kwargs):
print("----在test2函数中----")
print("args:", args)
print("kwargs", kwargs)
test1(*args, **kwargs)
test2(11, 22, 33, name="王老师", age=18)
运行结果
----在test2函数中----
args: (11, 22, 33)
kwargs {'name': '王老师', 'age': 18}
----在test1函数中----
args: (11, 22, 33)
kwargs {'name': '王老师', 'age': 18}
匿名函数
一、是什么
匿名函数:没有名字的函数,在Python中用lambda
定义
示例
lambda x, y: x + y # 定义了一个匿名函数 1.没有名字 2.完成2个数的加法操作
二、做什么
- 可以用一行代码完成简单的函数定义
- 可以当做实参快速传递到函数中去
三、怎样用
用lambda
关键词能匿名函数。这种函数得名于省略了用def
声明函数的标准步骤
1. 格式
lambda
函数的语法只包含一个语句,如下:
lambda 形参1, 形参2, 形参3: 表达式
2. 注意
lambda
函数能接收任何数量的参数但只能返回一个表达式的值,其默认就是返回的,不用写return
3. 使用方式
既然我们已经知道def
定义函数时的变量存储的是函数的引用,所以只要有了这个函数的引用,也就可以通过变量名()
的方式调用函数
而,函数分为def
定义的普通函数,和用lambda
定义的匿名函数,所以无论一个变量例如b
保存的是普通函数的引用,还是匿名函数的引用,都可以用b()
方式调用b指向的函数
一般情况下对匿名函数的使用有2种方式
- 通过
lambda
定义匿名函数,然后用一个变量指向这个匿名函数,然后通过变量名()
调用这个匿名函数 - 直接在调用其它函数实参的位置通过
lambda
定义匿名函数,会将这个匿名函数的引用当做实参进行传递
方式1示例:
# 定义了一个匿名函数,然后让变量add_2_nums指向它
add_2_nums = lambda x, y: x + y
# 调用add_2_nums指向的匿名函数
print("10+20=" % add_2_nums(10, 20))
以上实例输出结果:
0+20=30
方式2示例:
def fun(a, b, opt):
print("a = %d" % a)
print("b = %d" % b)
print("result = %d" % opt(a, b)) # 此时opt指向了第7行定义的匿名函数,所以opt(a, b)就相当于调用匿名函数
fun(1, 2, lambda x, y: x + y) # 定义一个匿名函数,且将它的引用当做实参进行传递
其他语言匿名函数及Lambda:
- javascript、ES6新增语法“箭头函数”,例:
(a,b)=>{return a+b;}
- C#的匿名函数,例:
var func = ((Func<int, int, int>)((x, y) =>
{
return x+y;
}));
引用id(a)可以查询a变量地址
文章转自:https://doc.itprojects.cn/0001.zhishi/python.0001.python3kuaisurumen/index.html#/README
截取部分需要备忘和语法糖部分记录
评论