栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

第八章:字符串和函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第八章:字符串和函数

注:该文章为自己所写笔记,心得;不一定对每一位程序猿有所帮助

如有错误还请帮忙告知更改

字符串驻留机制

1.什么是字符串的驻留机制

字符串驻留:是一种在内存中保存一份相同且不可变字符串的方法。(相同的字符串只保留一份)

不同的值被存放在字符串的驻留池当中,Python的驻留机制对相同的字符串只保留一份拷贝,后续创建相同的字符串时,不会开辟新的空间,而是把字符串的标识地址引用到新的变量元素,保证内存的占用资源

2.驻留适用范围(pycharm软件下直接存在驻留):

包含字母字符串[a-z]/[A-Z] 的字符串驻留字符串长度为0或1时,默认采用驻留机制

>>> a = ''
>>> b = ''
>>> a is b
True

字符串长度大于1时,且字符串中只包含大小写字母、数字、下划线(_) 时,采用驻留机制

>>> a = "1_2"
>>> b = "1_2"
>>> a is b
True

对于 [-5,256]之间的整数数字,Python默认驻留 

a=-5
b=-5
print(a==b)
True
a1=-6
b1=-6
print(a1==b1)
False

字符串 只在编译时进行驻留,而非运行时 。

# 运行时
a = "hello01"
b = "hello"
print(b + "01" is a)
#False
# 编译
a = "hello01"
b = "hello" +"01"
print(a is b)
#True

用乘法得到的字符串,如果结果长度 <=20且字符串只包含数字、字母大小写、下划线,支持驻留。长度>20,不支持驻留。保证内存的空间占用不会过大

强制驻留

import sys
a='abc%'
b='abc%'
a=sys.intern(b)
print(a is b)

字符串的常用操作  

a='hello,hello'
print(a.index('lo'))#3
print(a.rindex('lo'))#9
print(a.find('lo'))#3
print(a.rfind('lo'))#9
print(a.find('b'))#-1

a='Gtr,aE86'
print(id(a))#                         1635893325936
s=a.upper()#转大写
print(s,id(s))#转化后会产生新的id标识     GTR,AE86 1635893337648
s=a.lower()#小写
print(s,id(s))#转化后id标识地址变化      gtr,ae86 1635893328368
print(a.swapcase())#gTRAe86           大小写互相转化
print(a.title())#Gtr,Ae86              首字母大写其余小写
#只要进行大小写转化,标识地址就会发生变化

a='GTR永远的神'
print(a.center(10,'-'))#-GTR永远的神--      居中对齐,指定宽度10
print(a.center(10))# GTR永远的神            居中对齐,不设定参数默认空格
print(a.ljust(10,'-'))#GTR永远的神---       左对齐 默认空格
print(a.rjust(10,'-'))#---GTR永远的神       右对齐 默认空格
print(a.zfill(10))#000GTR永远的神           右对齐 0填充
print('-5201314'.zfill(10))#-005201314
print('+5201314'.zfill(10))#+005201314     右对齐,0填充如果遇到+-号默认将+-号置于第一位

a='GTR AE86 Dodge'
aa=a.split()#默认分割 默认分割符号为空格
print(aa)#['GTR', 'AE86', 'Dodge']
a1='GTR-AE86-Dodge'
print(a1.split())#['GTR-AE86-Dodge']               没有空格所以不分割
print(a1.split(sep='-'))#['GTR', 'AE86', 'Dodge']  设置分割符号为-
print(a1.split(sep='-',maxsplit=1))#['GTR', 'AE86-Dodge'] 分割一次
print(a1.rsplit())#['GTR-AE86-Dodge']       与左分割同理,只不过右侧开始分割
print(a1.rsplit(sep='-'))#['GTR', 'AE86', 'Dodge']         同理  
print(a1.rsplit(sep='-',maxsplit=1))#['GTR-AE86', 'Dodge']  同理 不过从右开始一次

a='GTR,AE86,Dodge'
print(a.isidentifier())#False 变量a1不是合格的标识符
#逗号不属于合法标识符,合法标识符包括数字字母下划线,详细看第二章
a1='GTR'
print(a1.isidentifier())#True
a2='张666'
print(a2.isidentifier())#True
print('isspance:','t'.isspace())#isspance.:True 是否全部回车换行字符制表组成
print('abc:','abc'.isalpha())#abc: True 是否全部字母组成
print('是否10进制数字组成:','A666'.isdecimal())#是否10进制数字组成: False
print('数字符号(包括罗马数字和中文数字符号):','四'.isnumeric())#数字符号(包括罗马数字和中文数字符号): True
print('isalnum:','AE86'.isalnum())#isalnum: True 是否全部由数字字母组成

a='my Dodge GTR 1 1'
print(a.replace('1','AE86'))#my Dodge GTR AE86 AE86 进行替换第一个为需要替换,第二个为替换后的词
print(a.replace('1','AE86',1))#my Dodge GTR AE86 1 第三个替换1次
print('-'.join(a))#进行连接 m-y- -D-o-d-g-e- -G-T-R- -1- -1 符号-
print(''.join(a))#my Dodge GTR 1 1 符号空格

#根据ascii表对比
print('apple'>'app')#True
print('apple'>'banana')#False
print(ord('a'),ord('b'))#97 98

#is与==的区别
#is比较的是id是否相等 ==比较value值
a=b='8686'
c='8686'
print(a==b)#True
print(a==c)#True
print(a is b)#True
print(a is c)#True
#因为驻留机制所以同个id和value

s='hello python'
#与列表切片同理,起始,结尾,步长
s1=s[:5]#无初始切的位置
s2='!'
s3=s[6:]#无最后切的位置
new=s1+s2+s3
print(new)#hello!python
print(s[::-1])#nohtyp olleh 负数步长倒着切

#%占位符
name='张三'
age=20
money=17520.42
print('我叫%s,今年%i,存款有%f' % (name,age,money))#我叫张三,今年20,存款有17520.420000

#{}占位符
print('我叫{0},今年{1}岁'.format(name,age))#我叫张三,今年20岁

#f-string
print(f'我叫{name},今年{age}岁')#我叫张三,今年20岁
print('%10d' % 99)#        99       10表示宽度
print('%.3f' % 3.149864165161)#3.150    3表示保留多少小数
print('{0:.3}'.format(3.14585151))#3.15 .3表示一共三位
print('{0:.3f}'.format(3.14585151))#3.146 .3 三位小数
print('{0:10.3f}'.format(3.14585151))#宽度为10,一共10位数字 3位小数

#编码
a='我要买GTR'
print(a.encode(encoding='GBK'))#GBK编码一个中文2字节
print(a.encode(encoding='UTF-8'))#utf-8编码一个中文2字节
#解码
byte=(a.encode(encoding='GBK'))
print(byte.decode(encoding='GBK'))
byte=(a.encode(encoding='UTF-8'))
print(byte.decode(encoding='UTF-8'))

1、函数的创建和调用

def hanshu(a,b):
    c=a+b
    return c

2、函数的参数传递

实参-->形参

位置参数;根据对应的实参对形参进行一个萝卜一个坑

def hanshu(a,b):#a,b形参
    c=a+b
    return c

a=hanshu(10,20)#10,20实参
print((a))

关键字参数:实参根据左侧关键名对应进行形参

def hanshu(a,b):#a,b形参
    c=a+b
    return c


a=hanshu(b=10,a=20)
print(a)
def fun(arg1,arg2):
    print('arg1',arg1)
    print('arg2', arg2)
    arg1=100
    arg2.append(10)
    print('arg1', arg1)
    print('arg2', arg2)
    n1=11
    n2=[22,33,44]
    print('n1',n1)
    print('n2',n2)
    fun(n1,n2)#将位置传参,arg1和arg2位形参,n1n2实参,因为是位置传参,实参名参名称可以不一样
    print('n1', n1)
    print('n2', n2)
    #函数调用过程红
    #如果不可变对象,函数体的修改不会影响实参  arg1修改为100,不会影响n1
    #如果是可变对象,函数体会修改实参的值     aeg修改。append增加10

3、函数的返回值

def fun(num):
    odd=[]
    even=[]
    for i in num:
        if i%2:#如果除以2不为0则
            odd.append(i)#添加到odd列表
        else:
            even.append(i)
    return odd,even #结束将奇数和偶数的列表返回

#函数调用
lst=[10,29,34,23,44,53,55]
print(fun(lst))#([29, 23, 53, 55], [10, 34, 44])


#1、如果函数没有返回值【函数执行完,不需要给调用处提供数据】return可以不写
def fun1():
    print('hello')#hello
    #return
fun1()

#2、函数的返回值,如果是一个,直接返回类型
def fun2():
    return 'hello'
a=fun2()
print(a)
#3、如果是多个返回值,返回的为元组
def fun3():
    return 'hello','world'
    print(fun3())

'''函数在定义时,是否需要返回值,视情况而定'''

4、函数的参数定义

def fun(a,b=10):
    print(a,b)

#函数调用
fun(100)#100 10  只有一个实参,另一个没有的使用默认参数
fun(20,30)#20 30 有两个实参,直接进行调用

print('hello',end='t')
print('world')

 

 

def fun(*weizhi):#函数定义时 可变的位置参数
    print(weizhi)
fun(10)#(10,)
fun(10,20)#(10, 20)
fun(10,20,30)#(10, 20, 30)


def fun1(**guanjianzi):#函数定义时 可变的关键字参数
    print(guanjianzi)
fun1(a=10)#{'a': 10}
fun1(a=20,b=30,c=40)#{'a': 20, 'b': 30, 'c': 40}

'''
#可变的位置参数只能是一个
def fun2(*weizhi1,weizhi2):
    print(weizhi1,weizhi2)
def fun3(*guanjianzi1,guanjianzi2):
    print(guanjianzi1,guanjianzi2)
fun2(12,12,23,24)
fun3(a1=11,b1=12,c1=13)
'''
def fun4(*weizhi3,**guanjianzi3):#当同时存在可变的形参,位置参数需要放在关键字参数前面才能运行
    pass
def aa(a,b,c):#abc在函数定义处,所以是形参
    print('a=',a)
    print('b=',b)
    print('c=',c)
#调用
aa(10,20,30)#函数调用时的参数传递,称位置实参
lst=[11,22,33]
aa(*lst)#在函数调用时,列表每个元素进行位置实参
print()

aa(a=100,c=300,b=200)#函数调用时传参,关键字实参
dic={'a':111,'b':222,'c':333}#函数调用时,字典每个元素进行关键字实参
aa(**dic)
def aa(a,b,c,d):
    print('a=', a)
    print('b=', b)
    print('c=', c)
    print('d=', d)

    aa(10,20,30,40)#位置实参
    aa(a=10,b=20,c=30,d=40)#关键字实参
    aa(11,22,c=33,d=44)#ab位置实参,cd关键字实参

5、变量的作用域

 

def aa(a,b):
    c=a+b#c为局部变量,函数体内定义好的变量,ab为形参,作用范围也是内部,为局部变量
    print(c)

aa(10,20)

def aaa():
    global age#age本是fun3函数内部定义的局部变量,使用global可以将其变为全局变量
    aoe=21
    print(aoe)
    aaa()
aaa()
print()

6、递归函数

 

def fac(n):
    if n==1:
        return 1#如果n=1,输出
    else:
        return n*fac(n-1)
print(fac(6))
#先进行6阶层 发现不为1,使用else的n*fac(n-1):相当于n*fac5阶层,一直循环到1结束
#可以理解为fac6=运行fac5*6
#6*(5*(4*(3*(2*(1))))))正向展开 逆向计算
def dinyi(a):
    if a==1:
        return 1#第一项的时候输出1
    elif a==2:
        return 1#第二项也输出1
    else:
        return  dinyi(a-1)+dinyi(a-2)#输出(a-1)+(a-2)的和

print(dinyi(6))

for a1 in range(1,7):#遍历1-6
    print(dinyi(a1))#进行调用函数计算

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025655.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号