一 字符串常用
1.1转换
代码演示:
#1.转换 #1.1字符串和整数之间的转换 :eval(xx);将字符串xx转换为有效的表达式 #str() int() num1 = eval("123") print(num1,type(num1)) num2 = int("123") print(num2,type(num2)) #+和-可以被int()识别,只能出现在字符串的第一个字符 print(eval("+123")) print(int("+123")) print(eval("-123")) print(int("-123")) #+和-出现在字符串的中间字符位置,eval可以转换为有效的表达式计算出结果,但是int直接报错 print(eval("12+3")) #print(int("12+3")) #ValueError: invalid literal for int() with base 10: '12+3' print(eval("12-3")) #print(int("12-3")) #ValueError: invalid literal for int() with base 10: '123' #print(eval("ab123")) #NameError: name 'ab123' is not defined #print(int("abc123")) #ValueError: invalid literal for int() with base 10: 'abc123' #1.2大小写字母转换 str1 = "today Is A Good DAY" #lower() :将大写字母转换为小写 print(str1.lower()) #upper():j将小写字母转换为大写 print(str1.upper()) #swapcase():大转小,小转大 print(str1.swapcase()) #capitalize():首个单词的首字母大写,其他字母小写 print(str1.capitalize()) #title():将每个单词的首字母大写 print(str1.title())
1.2填充
代码演示:
#2.填充 #center(width[,fillchar]):获取一个指定长度的的字符串,原字符串居中显示, # 两边使用指定的字符进行填充,如果没有指定字符,则默认使用空格填充 str1 = "hello" print(str1.center(20)) print(str1.center(20,"*")) #ljust(width[,fillchar]) left,原字符串居左显示 print(str1.ljust(20)) print(str1.ljust(20,"*")) #rjustwidth[,fillchar]) right,原字符串居右显示 print(str1.rjust(20)) print(str1.rjust(20,"*")) #TypeError: The fill character must be exactly one character long #注意;上面三个功能填充的时候,只能有一个字符 #zfill(width):获取一个指定长度的字符串,原字符串居右显示的,前面剩余的部分用0填充 print(str1.zfill(40))
1.3查找
代码演示:
#3.查找 str1 = "abcdefghhello123456" #find(str[,start,end]) 从左往右进行检测原字符串,str 是否在原字符串中,也可以指定查找的范围 #注意:返回从左往右查找匹配到的第一个子字符串的位置,如果查找不到,则返回-1 print(str1.find("e")) #4 print(str1.find("hello")) print(str1.find("e",5,10)) print(str1.find("yyyy")) #rfind() print(str1.rfind("e")) #9 print("**********") #index() ,和find的用法基本相同,区别:如果查找不到,find返回-1,index则直接报错 print(str1.index("e")) #4 print(str1.index("hello")) print(str1.index("e",5,10)) #print(str1.index("yyyy")) #ValueError: substring not found #rindex print(str1.rindex("e")) #9 #max() print(max([10,54,54,5])) #list print(max(10,43,65,65)) #number print(max("hello")) #字典中的顺序或者ASCII码 #min() print(min([10,54,54,5])) #list print(min(10,43,65,65)) #number print(min("hello")) #字典中的顺序或者ASCII码
1.4提取
代码演示:
#4.提取 #strip(str):以str作为条件提取字符串,除了两头指定的字符串【去除一个字符串两头的指定字符】 trim str1 = "************today is ****** a ****good day**********" print(str1.strip("*")) #lstrip() print(str1.lstrip("*")) #rstrip() print(str1.rstrip("*"))
1.5分割和合并
列表和字符串之间的转换
代码演示:
#5.分隔和合并 #字符串-----》列表 #split(str[,num]) 分隔,将str作为分隔符分隔元字符串,【结果为一个列表】,如果指定了num则表示仅使用num和字符串分隔 #注意:目前,字符串中的split只能分隔具有一定规律的字符串 str1 = "today is a good day" print(str1.split(" ")) print(str1.split(" ",3)) #练习:将str1中每个单词的首字母改为大写,不能使用title() str2 = "zhangsan@lisi@jack" print(str2.split("@")) #列表------》字符串 #join(list):将指定的字符串作为连接符,将列表中的元素连接起来,得到一个新的字符串,作用和split相反 list1 = ['today', 'is', 'a', 'good', 'day'] str3 = "123" newStr = str3.join(list1) print(newStr) #splitlines(flag) 按照换行符【\n,\r,\r\n】分隔,结果为列表 #flag:可以省略或者赋值为False,则表示忽略换行符,如果True,则表示保留换行符 str4 = '''today is a good day ''' print(str4.splitlines()) print(str4.splitlines(True))
1.6替换和字符串映射
代码演示:
#6.替换 #replace(old,new[,max]) """ 使用新的字符串替换掉原字符串,而且可以指定替换的最大次数 注意;默认替换原字符串中所有的子字符串 """ str1 = "today is a good good good day" print(str1.replace("good","bad")) print(str1.replace("good","nice",2)) #7.字符串映射 #maketrans():创建一个字符映射的关系表 #参数;第一个:表示需要转换字符串 第二个:表示转换的目标字符串 #得到的结果为一个字典,字典中的键值对就是映射关系 table = str.maketrans("abc","%#@") print(table) #{97: 54, 99: 56} #translate(table) str2 = "today is a good day" print(str2.translate(table)) #tod%y is % good d%y
1.7判断
代码演示:
#8.判断 #isalpha():如果一个字符串非空并且所有的字符都为字母,则返回True print("".isalpha()) print("abc".isalpha()) print("abc123".isalpha()) print("*********") #isalnum():如果一个字符串非空并且所有的字符都为字母或者数字,则返回True print("".isalnum()) print("abc".isalnum()) print("abc123".isalnum()) print("*********") #isupper():如果一个字符串中出现的字母全部是大写的话,则返回True print("a".isupper()) print("Abc".isupper()) print("ABC".isupper()) print("ABC123".isupper()) #islower()如果一个字符串中出现的字母全部是小写的话,则返回True #istitle():结合title()的用法,将一个字符串中每个单词的首字母大写【通过空格区分】 print("this is".istitle()) print("This is".istitle()) print("This Is".istitle()) #isdigit() 【掌握】判断一个字符串是否是由全数字组成的 print("abc".isdigit()) print("123".isdigit()) print("abc1234".isdigit()) #应用:int() while True: num = input("请输入一个数字:") if num.isdigit(): num = int(num) print(type(num)) break else: print("输入有误,请重新输入") print("*******") #isnumeric(),类似与isdigit的用法 print("abc".isnumeric()) print("123".isnumeric()) print("abc1234".isnumeric()) #isdecimal():检测字符串是否只包含十进制字符[字符串中是否只包含0~9的数字] print("4324".isdecimal()) print("4324abc".isdecimal()) #isspace():检测字符串中是否只包含空格 print(" ".isspace()) print("fh".isspace()) print("f h ".isspace()) #isXxxx hasXxxx;判断,结果为布尔值
1.8前缀和后缀
代码演示:
#9.前缀和后缀 #前缀一定包含,但是包含不一定是前缀 url = "http://www.baidu.com" #startswith(subStr,start,end):判断subStr是否是指定字符串的前缀 print(url.startswith("http")) #endswith(subStr):判断subStr是否是指定字符串的后缀 print(url.endswith("com"))
1.9编解码
代码演示:
#10.字符串的编码和解码 """ https://www.baidu.com/s?wd=%E5%8D%83%E9%94%8B&rsv_spt=1&rsv_iqid=0xb8e5907d00014e93&issp=1 """ #%E5%8D%83%E9%94%8B #encode():编码,将字符串类型-----》字节类型 s1 = "this is 千锋" s2 = s1.encode("utf-8") #b'this is \xe5\x8d\x83\xe9\x94\x8b' s3 = s1.encode("gbk") #b'this is \xc7\xa7\xb7\xe6' print(s2) print(s3) print(type(s2),type(s3)) #decode():解码,将字节类型------》字符串 s4 = s2.decode("utf-8") s5 = s3.decode("gbk") print(s4,s5) print(type(s4),type(s5)) #注意:编码和解码的类型必须一致 #encode是字符串的功能,decode是bytes的功能
1.10ASCII码转换
代码演示:
#chr():将编码转换为字符串 print(chr(65)) print(chr(48)) #ord():将字符串转换为编码 print(ord("e")) print(ord("2")) #需求:将hello转换为大写 s1 = "hello" #定义一个空字符串,用于拼接最后得到的结果 s2 = "" #遍历字符串,将每个字符获取出来 for c in s1: #将其转换为ASCII表中的数值 num = ord(c) #将num-32获取的对应的小写字母在ASCII码表中的数值 num -= 32 #将减之后的结果转换为字符串 s2 += chr(num) print(s2)
1.11掌握的功能
转换:int() str() title() capitalize() 填充:center() 提取:strip() 查找:find() index() 分割和合并:split和join 替换:replace() 判断:isdigit() 前缀和后缀:startswith() endswith()
2.做一个简单的购物车
代码演示:
#1.从控制台输入一句英文,判断每个单词出现的次数 str1 = "hello today is a good day hello today is a nice day" """ 实现思路: 1.使用空格作为分隔符将字符串分割,得到的结果为list 2.遍历list,将单词从列表中提取出来 3.将获取的单词到一个字典中去判断 4.如果单词不存在,则以单词作为key,1作为value添加到字典中;如果单词已经存在,将该单词的value递增1 """ list1 = str1.split(" ") #方式一:成员运算符 dict1 = {} for word in list1: if word not in dict1: dict1[word] = 1 else: dict1[word] += 1 print(dict1) #方式二:get() dict2 = {} for word in list1: value = dict2.get(word) if value == None: dict2[word] = 1 else: dict2[word] += 1 print(dict2) #2.获取指定时间的下一秒 """ 11:45:45----->11:45:46 11:45:59----->11:46:00 11:59:59-----》12:00:00 23:59:59-----》00:00:00 timeStr = input("请输入正确的时间:") #将时分秒从字符串中分离出来 timeList = timeStr.split(":") h = int(timeList[0]) m = int(timeList[1]) s = int(timeList[2]) s += 1 if s == 60: m += 1 s = 0 if m == 60: h += 1 m = 0 if h == 24: h = 0 print("%d:%.2d:%.2d" % (h,m,s)) """ #3.实现简单的购物车功能 """ a.引导用户选择商品 b.引导用户输入金钱 c.加入购物车 d.查看购物车,计算余额 """ #商品列表 productList = [("book",50),("kindle",500),("iphone xs",10000),("自行车",888)] #购物车 shoppingCar = [] #引导用户输入金额 saving = input("请输入金额:") if saving.isdigit(): #将savin转换为整型 saving = int(saving) #并不是添加一件商品就结束 while True: #打印商品信息,提供给用户进行选择 for i,p in enumerate(productList): print(i,":",p) #引导用户选择商品 choice = input("请输入商品编号【输入q退出】:") if choice.isdigit(): choice = int(choice) #检验编号的正确性 if choice >= 0 and choice <= len(productList) - 1: #根据用户输入的编号从productList中获取商品 item = productList[choice] #item是一个元组 #item[0]:商品名称 item[1]:商品价格 #判断用户的余额够不够 if saving >= item[1]: #减少用户的余额 saving -= item[1] #将商品添加到购物车中 shoppingCar.append(item) else: print("余额不足") else: print("该商品不存在") elif choice == "q": print("-----购物车中有如下商品------") for i in shoppingCar: print(i) print("还剩下%d钱" % (saving)) #退出循环,停止购买 break else: print("编号输入有误") else: print("输入有误")
二、函数
1.概述
案例
#需求:半径分别为r1 = 10,r2 = 13,r3 = 20,求圆的面积 r1 = 10 s1 = 3.14 * r1 ** 2 r2 = 13 s2 = 3.14 * r2 ** 2 r3 = 20 s3 = 3.14 * r3 ** 2 #使用函数进行优化 def area(radius): s = 3.14 * radius *2 area(10)
在实际的项目开发中,某些功能会被反复使用,哪么可以将该功能对应的代码封装起来,封装成函数,当需要再次使用该功能时,不需要再次书写相应的代码,只需要使用函数
本质:对某个特殊功能的封装
优点:
a.简化代码结构,提高代码的可读性和可维护性
b.方便使用某些特殊的功能,被当做工具使用
注意:函数也被称为方法
2.使用
函数的定义
语法:
def 函数名(参数1,参数2.。。。):
函数体
return 返回值
说明:
1.一个完整的函数由两部分组成:函数的声明部分和实现部分
2.def:definition,定义,函数使用def关键字定义
3.函数名:标识符,只需要遵循标识符的规则和规范即可
4.(参数1,参数2.。。。):()表示参数的开始和结束,被称为参数列表【形式参数列表,简称形参】,本质上其实就是一个个变量,当然,形参列表也可以为空【根据具体的需求决定】
5.函数体:需要被封装的特殊功能
6.return 返回值:return关键字用于结束函数,并且将后面的返回值返回给调用者
返回值:变量,常量,表达式等,返回值也可以被省略
设计一个函数:两个要素
参数:需求里面有没有未知项参与运算
返回值:函数运行结束之后需要将结果在后面的代码中执行
2.1简单的函数
无参无返回值的函数
代码演示:
#定义无参无返回值的函数 def myPrint(): print("hello") #注意:函数被定义完成之后,不会自动执行,需要手动执行,这个过程被称为函数的调用 """ 调用格式:函数名(实际参数,简称实参) 说明: a.出现在函数声明部分的参数被称为形式参数,简称形参,本质是一个变量 b.出现在函数调用部分的参数被称为实际参数,简称实参,本质是一个数据【常量,带有值的变量】 c.形参和实参之间的关系:形参 = 实参 d.函数的调用实际上是传参的过程:实参给形参赋值的过程 注意: a.进行传参的时候,实参和形参需要进行匹配【数量和类型】 b.如果形参为空,则调用函数的时候,实参也不需要写,但是()不能省略 """ myPrint() myPrint() myPrint() myPrint() myPrint() #注意:在同一个py文件中,如果出现同名的函数,则后出现的会覆盖掉先出现的【类似于变量的重新赋值】 def myPrint(): print("hello~~~~~~") myPrint()
2.2函数的调用
代码演示:
#函数的调用 def show1(): print("show~~~1") num = 10 print(num) #10 def show2(): print("show~~~2") show1() def show3(): print("show~~~3") show2() print("over") show3() #函数的函数体部分可以调用其他的函数,注意函数的调用顺序 #函数入栈和出栈 #在函数内部定义的变量,在函数的外部无法访问,因为没有访问权限【函数被调用完成之后会出栈】 #print(num) #注意:函数之间尽量不要相互调用,或者函数尽量不要自己调用自己 """ def fun1(): print("func1") fun2() """ def fun2(): print("fun2") fun2() fun2()
2.3函数的参数
代码演示:
#1 #定义一个有参数的函数 def myFunc(name,age): print(name,age) #传参 #注意1;形参的类型取决于实参的类型【Python是动态类型的语言】 myFunc("zhangsan",10) #name = "zhangsan" age = 10 #2 def myFunc(name,age): age += 1 print(name,age) #注意2:传参的过程中,一定要保证实参和形参的一一匹配【顺序,类型,数量】 myFunc("lisi",18) #需求:求1~某个数之间的偶数 def fun(num): for i in range(1,num + 1): if i % 2 == 0: print(i) fun(100) fun(1000) #需求;比较任意两个数的大小 def compare(num1,num2): if num1 > num2: print(num1) elif num1 < num2: print(num2) else: print("相等") compare(10,20) compile(34,67)