*arg和**kwarg作用
比如现在我有一个最简单的加法(Jiafa)函数:
def Jiafa(x, y):
z = x + y
return z
print(Jiafa(1,2))
这个很简单,一看就知道输出等于3。
那下一个问题是,如果我要算不固定个数的数字相加,那怎么来计算呢?
这时,就使用args和*kwarg,就可以帮助我们解决这种问题。
*args:可以理解为只有一列的表格,长度不固定。
**kwargs:可以理解为字典,长度也不固定。
首先,args和kwarg不是必须成对出现,也不是必须叫这个名字,也可以叫x和**y。写成这样,只是一种约定俗成,比如给别人讲故事:从前有个张三和李四……大家一听就知道你要说什么了,而不能说从前有个马七狗八,大家虽然也能听懂,但总是不太好理解。
先说args的作用,还是开篇的案例,我们要算不定长的加法,就可以用args来定义了,当然也可以叫x,y。
def Jiafa(*args):
sum = 0
for i in args:
sum = sum + i
print(sum)
Jiafa(1, 3, 5)
Jiafa(2, 4, 6, 8, )
输出结果,9和20。这个案例很简单,用*args定义就可以引入,相当于定义了不定长度的函数,然后在程序中就可以多次使用。
**kwargs的字典呢?先看一下普通的字典,用一对大括号{}就可以创建字典,比如下面3行程序,就可以编一个字典的程序:
dict = {"system": "系统", "China": "中国", "link": "联接"}
x = input("请输入一个英文单词:")
print(dict.get(x, "本字典里没找到!"))
如果输入正确,会得到答案,否则会显示没找到。
在这个程序里,dict = {"system": "系统", "China": "中国", "link": "联接"}创建了三对“键和值”(key和value),比如“system”是key,“系统”是key对应的值,也叫键值。
还可以写一个测试单词的小软件。
dict = {"system": "系统", "China": "中国", "link": "联接"}
通过Key找value的语句:
y = input("请输入China的中文意思:")
if dict['China'] == y:
print("恭喜你,答对了!")
通过value找Key的语句:
z = input("请输入“系统”的英文单词:")
if list(dict.keys())[list(dict.values()).index("系统")] == z:
print("恭喜你,答对了!")
现在问题来了,如果开始不知道字典里都有哪些内容,需要在程序运程中才知道怎么办?这个时候就可以用kwargs来定义了。我们先用kwargs来定义一个函数,函数内容先都不用写,再看看下面的小程序:
def dict(**kwargs):
return kwargs
mydict = dict(system="系统", China="中国", link="联接")
x = input("请输入单词:")
if x in mydict.keys():
print("中文意思:", mydict[x])
else:
print("抱歉,没找到。")
用字典也可以达成这样的功能,使用in……keys(),就是判断这个key是不是存在,如果存在就返回它的值。 同样,用**kwargs传递数据的功能,还可以设计一个用户登录的程序:
def dict(**kwargs):
return kwargs
userdict = dict(user1="1234", user2="5678")
x = input("请输入用户名:")
if x in userdict.keys():
y = input("请输入密码:")
if userdict[x] == y:
print("完全正确")
else:
print("密码错误!")
else:
print("用户不存在!")
以上的功能,都是能表达出args和*kwarg的功能的最精减代码,大家运动一下会更有助于理解。希望大家学会初步的功能,共同进步,加油!
is和==的区别
>>> a = 'cheesezh'
>>> b = 'cheesezh'
>>> a == b
True
>>> x = y = [4,5,6]
>>> z = [4,5,6]
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False
>>>
>>> print id(x)
3075326572
>>> print id(y)
3075326572
>>> print id(z)
3075328140
看例子就能看懂
简述Python的深浅拷贝以及应用场景
导入模块:import copy
浅拷贝:copy.copy
深拷贝:copy.deepcopy
字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层。所以对于只有一层的数据集合来说深浅拷贝的意义是一样的,比如字符串,数字,还有仅仅一层的字典、列表、元祖等.
对于数字和字符串的深浅拷贝都只是将变量的索引指向了原来的内存地址,无论修改任意其中一个变量,只是将其指向了另一个内存地址,其他两个变量不会变,字符串同理。因此,对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。
深拷贝的时候python将字典的所有数据在内存中新建了一份,所以如果你修改新的模版的时候老模版不会变。相反,在浅copy 的时候,python仅仅将最外层的内容在内存中新建了一份出来,字典第二层的列表并没有在内存中新建,所以你修改了新模版,默认模版也被修改了。
列举常见的内置函数
一、数学相关
1、绝对值:abs(-1)
2、最大最小值:max([1,2,3])、min([1,2,3])
3、序列长度:len('abc')、len([1,2,3])、len((1,2,3))
4、取模:divmod(5,2)//(2,1)
5、乘方:pow(2,3,4)//2**3/4
6、浮点数:round(1)//1.0
二、功能相关
1、函数是否可调用:callable(funcname),注意,funcname变量要定义过
2、类型判断:isinstance(x,list/int)
3、比较:cmp('hello','hello')
4、快速生成序列:(x)range([start,] stop[, step])
三、类型转换
1、int(x)
2、long(x)
3、float(x)
4、complex(x) //复数
5、str(x)
6、list(x)
7、tuple(x) //元组
8、hex(x)
9、oct(x)
10、chr(x)//返回x对应的字符,如chr(65)返回‘A'
11、ord(x)//返回字符对应的ASC码数字编号,如ord('A')返回65
四、字符串处理
1、首字母大写:str.capitalize
复制代码 代码如下:
>>> 'hello'.capitalize()
'Hello'
2、字符串替换:str.replace
复制代码 代码如下:
>>> 'hello'.replace('l','2')
'he22o'
可以传三个参数,第三个参数为替换次数
3、字符串切割:str.split
复制代码 代码如下:
>>> 'hello'.split('l')
['he', '', 'o']
可以传二个参数,第二个参数为切割次数
以上三个方法都可以引入String模块,然后用string.xxx的方式进行调用。
五、序列处理函数
1、len:序列长度
2、max:序列中最大值
3、min:最小值
4、filter:过滤序列
复制代码 代码如下:
>>> filter(lambda x:x%2==0, [1,2,3,4,5,6])
[2, 4, 6]
5、zip:并行遍历
复制代码 代码如下:
>>> name=['jim','tom','lili']
>>> age=[20,30,40]
>>> tel=['133','156','189']
>>> zip(name,age,tel)
[('jim', 20, '133'), ('tom', 30, '156'), ('lili', 40, '189')]
注意,如果序列长度不同时,会是下面这样的结果:
复制代码 代码如下:
>>> name=['jim','tom','lili']
>>> age=[20,30,40]
>>> tel=['133','170']
>>> zip(name,age,tel)
[('jim', 20, '133'), ('tom', 30, '170')]
6、map:并行遍历,可接受一个function类型的参数
复制代码 代码如下:
>>> a=[1,3,5]
>>> b=[2,4,6]
>>> map(None,a,b)
[(1, 2), (3, 4), (5, 6)]
>>> map(lambda x,y:x*y,a,b)
[2, 12, 30]
7、reduce:归并
复制代码 代码如下:
>>> l=range(1,101)
>>> l
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
>>> reduce(lambda x,y:x+y,l)
5050
至少列举8个常用模块都有那些
pip、pygame、pyMysql、sys、math、time、os
re的match和search区别?
match()函数只检测RE是不是在string的开始位置匹配,
search()会扫描整个string查找匹配;
也就是说match()只有在0位置匹配成功的话才有返回,
如果不是开始位置匹配成功的话,match()就返回none。
例如:
print(re.match(‘super’, ‘superstition’).span()) 会返回(0, 5)
而print(re.match(‘super’, ‘insuperable’)) 则返回None
search()会扫描整个字符串并返回第一个成功的匹配
例如:print(re.search(‘super’, ‘superstition’).span())返回(0, 5)
print(re.search(‘super’, ‘insuperable’).span())返回(2, 7)
什么是正则的贪婪匹配
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab.*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。