Python 语法基础 (字符串和函数使用)
0函数的参数
对于函数而言,参数分为了形参和实参两种:
形参是在函数的定义中使用的,而实参是在函数的调用中使用的
0)对于实参而言,参数有两种方式,一种是位置参数,另一种是关键字参数
1) 对于形参而言,参数的传入有四种,分别为位置参数,*args,关键字参数,**kwargs
这四种方式之间存在着某种顺序,位置参数>*args>关键字参数>**kwargs
*args 用于不确定形参个数的情况下,将形参中的位置参数存放在一个列表中
**kwargs用于不确定形参个数的情况下,将形参中的关键字参数存放在一个字典中
1函数的返回值
函数的返回值分为了以下3种情况:没有返回值,有一个返回值,有多个返回值
0)没有返回值又分为了以下几种情况:
a).函数中没有出现return
b). 函数中出现了return 但是return后什么都不跟
c). return NOne
1) 有一个返回值
可以用一个变量去接收这个返回值
2)有多个返回值
a).用一个变量去接收多个返回值,多个返回值存放在一个元组中
b).用等数量的变量去接收多个返回值
2字符串和列表之间的类型转换
字符串类型转列表类型 split
列表类型转字符串类型 join
3 判断字符串中某个元素的类型(数字,字母,数字与字母混合,空格等)
0)用isdigit函数判断是否数字
1) 用isalpha判断是否字母
2)用isalnum判断是否数字和字母的组合
3) 用isspace判断是否空格
4 使用字典的情况
目前理解太浅,当输出多个变量而这些变量分别代表的内容不直观时,在存储的时候创建一个字典来存储这多个变量 {‘key1’:0,‘key2’:0 … }
或者 字典名.setdefault(‘键值’, [])
5 函数的命名空间和作用域
函数的命名空间分为了三种情况,内置命名空间,外部命名空间以及内部命名空间
0)内置命名空间定义了python中存在的一些关键字,比如print,input等,(这些是不用我们操心的)
1)外部命名空间是指函数外部区域定义的空间
2)内部命名空间是指在函数内部区域定义的空间
听起来是不是有点像废话,是的我也感觉很傻,一般来说,命名空间要和作用域放在一起来看
3) 函数的作用域分为了全局作用域和局部作用域
其中内置命名空间和外部命名空间定义的变量可以作用于全局,而内部命名空间定义的变量仅仅只能作用于函数内部
4) 在局部作用域中,可以查看外部变量的值,但是不可对外部变量的值进行修改,如果非要进行修改,比较在局部作用域中加上 global 变量
注意:但是一般不推荐这种方式,因为它会降低代码的安全性同时别的程序员也对你的代码很难理解
6 两个内置函数globals()和locals()
0) globals() 会返回所有的全局变量(思考了一下,这里使用打印是不太合适的),并存放在一个字典中
1) locals()会返回当前位置的所有变量,并存放在一个字典中,所以在某些情况下,globals()和locals()会打印相同的结果
3)由上面2个图可以看出,globals()所返回的内容是可以修改的,而locals()所返回的内容是不可修改的
7 函数名的本质
0)函数名可以赋值
1) 函数名可以作为容器类型的元素
2) 函数名可以作为参数
3)函数名可以作为返回值
注意:理解函数名的本质就可以理解闭包
8 闭包
写这里的时候看到一个很有意思的比喻我在这里直接引用了
比喻:
通俗地讲就是别人家有某个东西,你想拿到但是因为权限不够(不打死你才怪),但是你可
以跟家里的孩子套近乎,通过他拿到!这个家就是局部作用域,外部无法访问内部变量,孩
子是从家里返回对象,对家里的东西有访问权限,借助返回对象间接访问内部变量!
这个方法一的写法在我目前阶段并不常见,但思考了一些也是可行的,不得不深深地佩服前人的智慧,更佩服始作俑者的智慧了!
注意:上图的闭包是不带参数的,而实际的闭包中可能会带参数,所以上述的看看就好啦
9 判断所输入对象的类型(列表,字符串,元组等)
0)判断是否为列表:if type(x) is list
1)判断是否为字符串:if type(x) is str
2)判断是否为元组:if type(x) is tuple
3)判断是否为字典: if type(x) is dict
10 time模块的简单介绍(一个简单的装饰器)
0)time.time()获取从1970年开始计时的秒数的积累
1) time.sleep(a)让程序停留a秒再执行
2)一个专门计时的时间函数
eg:
def timmer(func):#采用闭包的形式(值得深思) def inner(): start = time.time() func() end = time.time() print(end - start) return inner
func = timmer(func) func()
11 装饰器
0)装饰器的本质:timmer()函数就是一个装饰器函数,对某个函数有装饰的作用
1)装饰器的原则:开放封闭原则;对扩展是开放的,对修改是封闭的
2)装饰器的作用:不想修改函数的调用方式,还想在函数前后增加一些功能
3)装饰器的分类:有返回值的装饰器,有一个参数的装饰器,有多个参数的装饰器
4)语法糖
@装饰器函数名 eg @timmer
紧紧地放在被装饰函数的上一行
5)装饰器的固定模版(每天默写一遍)
def wrapper(func): def inner(*args, **kwargs): ret = func(*args, **kwargs) return ret return inner
@wrapper
咦,csdn这个功能整挺好,妈妈爱了~~~
正常的流程与加了装饰器的流程:
12 聚合和打散(这是一个以前忘记的知识点,干脆就夹在这里吧)
目前还不知道有什么用途T_T
0)形参:
在形参处出现*就是在聚合成一个元组
在形参处出现**就是将关键字参数聚合成一个字典
1)实参:
在实参调用的时候 *将可迭代的对象(字符串,列表,元组,字典,结合)打散
在实参调用的时候 **将可迭代的对象(字典)打散,字典是将键取出 关键字参数(键=值)
13 用timmer()进行斐波那切计时的时候遇到了一个问题
import time def timmer(f): def inner(*args, **kwargs): begin = time.time() ret = f(*args, **kwargs) end = time.time() print(end - begin) return ret return inner
@timmer #func = timmer(func) def func(n): time.sleep(0.1) if n < 2: return 1 else: return func(n-1) + func(n-2) print(func(6))
有一个大大的疑问:为什么print(end -begin)会执行很多次呢?
有一个大佬说因为递归存在入栈的问题,目前还不能理解,等以后来填坑吧
14 装饰器的进阶
之前我们遇到的装饰器都是一个装饰器用来装修一个函数,但是在实际应用中,存在以下两种情况:
0)一个装饰器装饰多个函数
我们可以在原先的模版上稍作修改:
def outer(flag): def wrapper(func): def inner(*args, **kwargs): ret = func(*args, **kwargs) return ret return inner return wrapper
@outer(FLAG)
-
多个装饰器装饰一个函数:
这里不做例子了,就一张图来说明吧,通俗易懂,我把它称之为‘套娃’
本文地址:https://blog.csdn.net/blessingchacha/article/details/108853948
推荐阅读