python函数的嵌套调用与嵌套定义_python递归函数详解

python函数的嵌套调用与嵌套定义_python递归函数详解函数的嵌套:1、举例1:1deff1():2print(“rain”)34deff2(arg):5arg()6print(‘sir’)78f2(f1)输出结果:rainsir2、举例2:判断列表中大于33的数并返回给新

函数的嵌套:

1、举例1:

1 deff1():2 print(“rain”)3

4 deff2(arg):5 arg()6 print(‘sir’)7

8 f2(f1)

输出结果:

rain

sir

2、举例2:判断列表中大于33的数并返回给新的元素

1 defrdeflter(xrg,ran):2 temp =[]3 for i inran:4 ifxrg(i):5 temp.append(i)6 returntemp7

8 defrif(i):9 if i>33:10 returnTrue11 else:12 returnFalse13

14 a1 = [11,22,33,44,55]15 ret =rdeflter(rif,a1)16 print(ret)

输出结果:

[44, 55]

总结:从上面的例子可以看出,f1–其实是等于一个函数而对于f1()—-是执行一个函数。函数名可以当于对象进行传递

3、判断用户名密码是否正确

举例:

ContractedBlock.gif

ExpandedBlockStart.gif

1 deflogin(username,password):2 “””

3 把新的用户名和密码录入到库中4 :param username:5 :param password:6 :return: 如果用户注册成功返回Ture,否则返回Flase7 “””

8 with open(‘user_pass’,’a+’,encoding=’utf-8′) as f3:9 userpass = ‘\n’ + username + ‘$’ +password10 f3.write(userpass)11 f3.flush()12 f3.seek(0)13 for line inf3:14 line =line.strip()15 temp = line.split(‘$’)16 if temp[0] == username and temp[1] ==password:17 returnTrue18 else:19 returnFalse20

21

22 defiflogin(username):23 “””

24 判断用户名是否存在25 :param username: 用户注册的用户名26 :return: 如果用户名存在返回True,否则返回Flase27 “””

28 with open(‘user_pass’,’r’,encoding=’utf-8′) as f2:29 for line inf2:30 line =line.strip()31 temp = line.split(‘$’)32 if temp[0] ==username:33 returnTrue34 else:35 returnFalse36

37 defsinlog(username,password):38 “””

39 判断输入用户名与密码是否正确40 :param username: 用户输入的用户名41 :param password: 用记输入的密码42 :return: 如果输入都正确返回True,否则返回False43 “””

44 with open(‘user_pass’,’r+’,encoding=’utf-8′) as f1:45 for line inf1:46 line = line.strip()#去除两边的’\n’以及空格

47 temp = line.split(‘$’)#以$为分隔取出用户名和密码

48 if username == temp[0] and password == temp[1]:49 returnTrue50 returnFalse51

52 importgetpass53

54

55 print(“欢迎你的登录”)56 ret1 = input(“输入你的选择1代表登录,2代表注册:”)57 if ret1 == ‘1’:58 user = input(“请输入用户名:”)59 pawd = getpass.getpass(“请输入密码:”)60 ret =sinlog(user, pawd)61 ifret:62 print(“登录成功”)63 else:64 print(“登录失败”)65 elif ret1 == ‘2’:66 user = input(“请输入用户名:”)67 pawd = getpass.getpass(“请输入密码:”)68 ret2 =iflogin(user)69 ifret2:70 print(‘用户名已存在’)71 else:72 ret3 =login(user,pawd)73 ifret3:74 print(“恭喜你注册成功”)75 else:76 print(“注册失败,请重新注册”)77 else:78 print(“你已退出”)

View Code

特别说明:对于文件user_pass中内容是:cisco$cyc123

rain$sir

冒泡排序

举例:

ContractedBlock.gif

ExpandedBlockStart.gif

1 a1 = [11,22,3,12,32,123,30,32]2 for i in range(1,len(a1)-1):3 for k in range(len(a1)-i):4 if a1[k] > a1[k+1]:5 temp =a1[k]6 a1[k] = a1[k+1]7 a1[k+1] =temp8

9 print(a1)

View Code

递归:

举例:

ContractedBlock.gif

ExpandedBlockStart.gif

deff4(delen,a1,a2):

a3= a1 +a2if delen == 10:returna1

delen+= 1ret=f4(delen,a2,a3)returnret

temp= f4(1,0,1)print(temp)

View Code

装饰器:一般当我们不能去修改原来的底层代码的时候可以用

举例:

ContractedBlock.gif

ExpandedBlockStart.gif

defconfig(func):defkoko():print(‘hello’)print(‘hello’)

r=func()print(‘123’)returnrreturnkoko

@configdeff1():print(‘f1’)return 999

deff2():print(‘f2’)

temp=f1()print(temp)

View Code

总结:运行的步骤:

1、当我们去执行上面的代码时,首先我们会把config的函数放入内存中

2、然后一步步的住下走当我们看到@符号时,我们会把f1当做对象给他放到config函数中,这时func就等于f1,并且会把config的返回值给f1

3、从上面的解释可以看到现在f1就等于koko

上面的例子还可以这么想:

ret = config(f1)

f1 = ret

temp = f1()

print(temp)

装饰器有两个参数里:

举例:

defource(foun):definext(a1,a2):print(“thank”)

r=foun(a1,a2)print(‘syr’)returnrreturninext

@ourcedeff1(a1,a2):print(“hello”)return a1+a2

abc= f1(10,20)print(abc)

输出结果:

thank

hello

syr

30

总结:

工作过程:由于之前的讲解可以知道当我们去运行f1()的时候相当于我们运行了inext(),因为对于原来来说我们在利用f1函数的时候我们使用了两个参数,那么当我们在次使用时还是会使用这两个参数,那么我们就需要在inext中添加两个形参,由于foun是原来的f1函数,所以也需要两个形参。

重要:当我们定义两个相同函数的时候默认会执行最后写的函数

装饰器有多个参数时:

举例:

defource(foun):def inext(*args,**kwargs):print(“thank”)

r= foun(*args,**kwargs)print(‘syr’)returnrreturninext

@ourcedeff1(a1,a2):print(“hello”)return a1+a2

@ourcedeff2(s1):print(“kuku”)returns1

abc= f1(10,20)print(abc)

aaa= f2(100)print(aaa)

输出结果:

thank

hello

syr

30

thank

kuku

syr

100

总结:对于之前我们学习的时候,当我们有多个参数的时候我们可以*和**来做,这样不管我们在输入多少个参数时都可以,在这里当我

1325513-20180320123034331-1292893914.jpg

一个函数应用多个装饰器:

举例:

defoure_0(foun):def inext(*args,**kwargs):print(“this”)

foun(*args,**kwargs)return 1234

returninextdefource(foun):def inext(*args,**kwargs):print(“thank”)

r= foun(*args,**kwargs)print(‘syr’)returnrreturninext

@oure_0

@ourcedeff1(a1,a2):print(“hello”)return a1+a2

abc= f1(10,20)print(abc)

输出结果:

this

thank

hello

syr

1234

总结:工作流程

1325513-20180320123221188-1257246231.jpg

正则表达式:

就本质而言,其实正则表达式,他有自己的一套规则,在很多语言中都有使用。

在python中当我们需要使用正则表达式的时候我们需要导入re的模式。

基本的正则表达式: . ^ $ * + ? {} [] | () \

import re

re.findall——————————-也是查找的意思与字符串的find差不多,但是他返回是查找的内容并放入列表中

.—————————用来配置任意的字符,一个点代表一个字符:

举例:

import re

ret = re.findall(‘rain..r’,’abcdjkrainsirkijj’)

print(ret)

输出结果:

[‘rainsir’]

^—————————从起始的位置开始查找,所查找的内容必须要在起始的位置

举例:

import re

ret = re.findall(‘^rain’,’rainrabcdjkrainsirkijj’)

print(ret)

ret1 = re.findall(‘^rain’,’srainrabcdjkrainsirkijj’)

print(ret1)

输出结果:

[‘rain’]

[]

$————————–从尾部的位置开始查找,所查找的内容必须在尾部。

举例:

import re

ret = re.findall(‘rain$’,’rabcdjkrainsirkijjrain’)

print(ret)

ret1 = re.findall(‘rain$’,’srainrabcdjkrainsirkijj’)

print(ret1)

输出结果:

[‘rain’]

[]

*————————匹配*前面的那个字符0到任意次数

举例:

import re

ret = re.findall(‘rain*’,’rabcdjkrainnnnnsirkijjraidfsdf’)

print(ret)

输出结果:

[‘rainnnnn’, ‘rai’]

+————————-与*的功能一样区别是是匹配的次数是1到任意

举例

import re

ret = re.findall(‘rain+’,’rabcdjkrainnnnnsirkijjraidfsdf’)

print(ret)

输出结果:

[‘rainnnnn’]

?————————-与*和+号的功能一样,只是次数是0-1

举例:

import re

ret = re.findall(‘rain?’,’rabcdjkrainnnnnsirkijjraidfsdf’)

print(ret)

输出结果:

[‘rain’, ‘rai’]

{}—————————-与+、$、?不同的事他可以指定重复的次数,其他功能一样

举例:

import re

ret = re.findall(‘rain{3}’,’rabcdjkrainnnnnsirkijjrainndfsdf’)—————————-指定一个重复的次数

print(ret)

ret1 = re.findall(‘rain{3,5}’,’rabcdjkrainnnnnnsirkijjrainnnndfsdf’)——————指定重复的次数

print(ret1)

输出结果:

[‘rainnn’]

[‘rainnnnn’, ‘rainnnn’]

[]——————————字符集,可以匹配[]内某个字符,以或的形式

举例:

import re

ret = re.findall(‘ra[ik]n’,’rabcdjkrainnnnnsirkijjraknndfsdfraikn’)

print(ret)

输出结果:

[‘rain’, ‘rakn’]

总结:以上面的例子来讲,a字符与n字符中间的字条可以是i或者是k之中的任意一个,是一个或者的关系

一般一些特殊的字符放在字符集时就变成普通的字符了,但也有一些在字符集时是有特殊意义的。比如:-、

findall————————–取出组里面的内容

search—————————取出所有内容

举例:

import re

ret = re.findall(‘ra[.]n’,’rabcdjkra.nnnnnsirkijjraknndfsdfran’)

print(ret)

输出结果:

[‘ra.n’]

[-]—————————————–可指定一个范围

举例:

import re

ret = re.findall(‘[a-s]’,’dfefadfafe’)

print(ret)

ret1 = re.findall(‘a[a-s]f’,’adfefakfa’)

print(ret1)

输出结果:

[‘d’, ‘f’, ‘e’, ‘f’, ‘a’, ‘d’, ‘f’, ‘a’, ‘f’, ‘e’]

[‘adf’, ‘akf’]

[^]——————————————-排除某个范围即非的意思

举例

import re

ret = re.findall(‘[^a-s]’,’dfefadfafexy’)

print(ret)

ret1 = re.findall(‘a[^a-s]f’,’adfefayfa’)

print(ret1)

输出结果:

[‘x’, ‘y’]

[‘ayf’]

[/d]—————————————-在字符集中\还是有特殊的意义的

(\d*?)——————————————–这样的话就是取0个十进制数,因为*的范围是0到任意那么在后面加上?号就是取最小

(\d+?)——————————————–与上面的同意,这里取一个

\d———————————找出所有的十进制数

\w———————————找出所有的字母和数字

\s———————————找出所有的空格

re.search()—————————————-只查找其中的一个

re.match()—————————————-只查找开头如果没有就返回空

re.I——————————-不区分大小写

举例:

import re

re.findall(‘com’,’COMdfeafd’,re.I)

re.S—————————————-匹配包括换行内的所有的字符

举例

re.findall(‘.’,’adfeifld\ndfdfeaf’,re.S)

sub subn:———————————–替换

def sub(pattern, repl, string, count=0, flags=0):————————————-Pattern-指需要替换的字符,repl–替换后的字符,String原字符串,count-替换的次数

举例:

a = ‘123abc12313 112312abc2313’

ret2 = re.sub(‘abc’,’aaa’,a )

print(ret2)

输出结果:

123aaa12313 112312aaa2313

def subn(pattern, repl, string, count=0, flags=0):——————————————-与sub不同的是他可以返回被替换的次数

举例:

a = ‘123abc12313 112312abc2313’

ret2 = re.subn(‘abc’,’aaa’,a )

print(ret2)

输出结果:

(‘123aaa12313 112312aaa2313’, 2)

compile————————————–可以先定义匹配的规则,然后根据规则在做别的事

举例:

p = re.compile(‘\d’)

ret3 = p.split(“one1two2three3four4”)

print(ret3)

输出结果:

[‘one’, ‘two’, ‘three’, ‘four’, ”]

取一段字符串中的ip地址:

举例:

import re

ret = re.search(r'(((1?\d?\d)|(2[0-4]\d)|(25[0-5]))\.){3}((1?\d?\d)|(2[0-4]\d)|(25[0-5]))’,’http:111.168.10.14twt4tw’)

print(ret.group())

输出结果:

111.168.10.14

原生字符串

产生的原因:对于某些特殊的字符,python和正则表达式所使用的规则不同,当我们在python中使用某些特殊的字符的时候默认他是以python的规则来处理,而有些我们需要他以正则的规则来处理,或者让某些特殊的字符在python中没有意义,变成普通的字符,而原生字符串就是来处理这种事的。

举例:

ret = re.findall(‘\\’,’abcd\kf’)————————–一般按我们python的语法来说这样写是没有问题的,但是由于使用的正式那么这时就有问题了

ret = re.findall(‘\\\\’,’abcd\kf’)———————–这样写就没有问题了:处理的过程如下图

1325513-20180320123359422-2002626725.jpg

通过上面的工作流程,我们可以用下面的方法来写:

ret = re.findall(r’\\’,’abcd\kf’)——————————这个也可以

ret = re.findall(r’\\’,r’abcd\kf’)—————————————-这个更好

findall(self, string, pos=0, endpos=-1)———————————-查找所有匹配的返回一个列表

finditer(self, string, pos=0, endpos=-1)——————————————–查找匹配的的内容并返回位置

fullmatch(self, string, pos=0, endpos=-1)

match(self, string, pos=0, endpos=-1)————————————————查找匹配的内容,必须要是首个开始的

search(self, string, pos=0, endpos=-1)———————————————-只查第一个匹配的内容就返回,形成元组

split(self, string, maxsplit=0):——————————————————–

sub(self, repl, string, count=0)———————————————————–替换

subn(self, repl, string, count=0)———————————————————-替换并返回次数

\b————————–可以用来断定除去字母和数字以外的特殊的字符,是一个判断条件

举例:

ret = re.findall(r’I\b’,’I MESS IYOU’)print(ret)

输出结果:[‘I’]

总结:当程序去查找 I 时因为在我们查找的后面加上了/b,那么这时他只要匹配到后面有特殊的字符,那么就相当于匹配成功了。

优先获取取里面的内容:()

举例:

ret = re.findall(‘www.(baidu|cisco).com’,’acbcdwww.baidu.comcdefdwww.cisco.comjie’)

print(ret)

输出结果:

[‘baidu’, ‘cisco’]

总结:由上面的结果发现,其实我们想取的是www.baidu.com这个网址,但是我们却取了baidu与cisco,这是由于正则默认他会去取组里的内容我们可以用下面这种方法来让他放弃这种规则:在(后面加下?:

ret = re.findall(‘www.(?:baidu|cisco).com’,’acbcdwww.baidu.comcdefdwww.cisco.comjie’)

print(ret)

输出结果:

[‘www.baidu.com’, ‘www.cisco.com’]

今天的文章python函数的嵌套调用与嵌套定义_python递归函数详解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84025.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注