Python基础学习(3)


一、元组

习题

1、元组概念

写出下面代码的执行结果和最终结果的类型。分析为什么会出现这样的结果。

答:
执行结果:

(1, 2)*2   #(1, 2, 1, 2)
(1, )*2    #(1, 1)
(1)*2      #2

最终结果的类型:

print(a, type(a))    # (1, 2, 1, 2) <class 'tuple'>    元组
print(b, type(b))    # (1, 1) <class 'tuple'>          元组
print(c, type(c))    # 2 <class 'int'>                 整型

分析:
第一个(1, 2)为一个元组,元组*重复操作符,即重复两次元组得到(1, 2, 1, 2)

第二个括号内只有一个元素,但里面有逗号则为元组,与第一个一样为重复两次元组得到(1, 1)

第三个虽然有括号,但是括号被视为运算符,则(1)不为元组,变量×2得2。


2、拆包过程是什么?
a, b = 1, 2

上述过程属于拆包吗?
可迭代对象拆包时,怎么赋值给占位符?

答:
(1)拆包过程就是将元组中的多个元素拆分到多个变量当中。

(2)个人认为属于拆包过程,等号右边为一个元组,等号左边为两个变量,得到的结果为 a = 1b = 2

(3)例:

t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
# 1 10.31 OK python

贴上另一位代码狗(同学)对这道题的见解:
在这里插入图片描述


提点个人觉得该注意的点

一、元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。
例如:

t1 = (1, 2, 3, [4, 5, 6])
print(t1)  # (1, 2, 3, [4, 5, 6])

t1[3][0] = 9         #对元组中的列表内的值进行了修改
print(t1)  # (1, 2, 3, [9, 5, 6])

二、当要增加或删除元组中的一个元素时,不能直接删除或者增加,需要你成为一位手巧的手术医生,用切片将元组切开,再用+将你所要加入的元素加进去。

例:

week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday',) + week[2:]
print(week)  # ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')

三、创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。
例:

t2 = 1, 10.31, 'python'
print(t2, type(t2))
# (1, 10.31, 'python') <class 'tuple'>   #元组也可以不用括号括起来就能创建

x = (1,)                             #也可以x = 1,
print(type(x))  # <class 'tuple'>

注意不要被骗了窝!!!


二、字符串

习题

1、字符串函数回顾

(1)怎么批量替换字符串中的元素?

  • 答:使用replace(old, new [, max])函数。
  • 例:
str5 = ' I Love LsgoGroup '
print(str5.strip().replace('I', 'We'))  # We Love LsgoGroup

(2)怎么把字符串按照空格进行拆分?

  • 答:split(str="", num) 不带参数默认是以空格为分隔符切片字符串,如果num参数有设置,则仅分隔num个子字符串,返回切片后的子字符串拼接的列表。
  • 例:
str5 = ' I Love LsgoGroup '
print(str5.strip().split())  # ['I', 'Love', 'LsgoGroup']
print(str5.strip().split('o'))  # ['I L', 've Lsg', 'Gr', 'up']

(3)怎么去除字符串中的空格?

  • 答:lstrip([chars]) 截掉字符串左边的空格或指定字符。
  • rstrip([chars]) 删除字符串末尾的空格或指定字符。
  • strip([chars]) 在字符串上执行lstrip()rstrip()
  • 例:
str5 = ' I Love LsgoGroup '
print(str5.lstrip())  # 'I Love LsgoGroup '
print(str5.lstrip().strip('I'))  # ' Love LsgoGroup '
print(str5.rstrip())  # ' I Love LsgoGroup'
print(str5.strip())  # 'I Love LsgoGroup'

若需要去除字符串中间的空格,则先将字符串用split()分开,再通过for函数合并。

str = 'I love python'
str1 = ''
str.split()    # ['I', 'love', 'python']
for i in str.split():
	str1 += i
print(str1)    # Ilovepython

2、实现isdigit函数
题目要求
实现函数isdigit, 判断字符串里是否只包含数字0~9
答:

def isdigit(string):
    return str = string.isnumeric()

print(isdigit('123456789'))  # True
print(isdigit('asdfas32d4f'))  # False

3、leetcode 5题 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:

输入: “babad”
输出: “bab”

输入: “cbbd”
输出: “bb”

答:

    # your code here

class Solution:
   def longestPalindrome(self, s):
      k = ''                                 #创建一个空字符串用于存放回文子串
      for index,char in enumerate(s):        #得出字符串对应字符的索引值
         j = s.rfind(char)                   #从字符串右边开始寻找同样字符串的索引值
         while 1:
            if j == index:                   #判断从右边找到的字符索引值是否等于当前字符的索引值
               break
            else:
               a = s[index:j+1]              #将这段子串存在a中
               d = s[0:j]
               c = s[index:j+1]
               b = c[::-1]                   #将子串翻转
               if a == b:                    #是回文子串则输出给k
                  if len(k) < len(a):
                     k = s[index:j+1]
                     break
               else:
                  j = d.rfind(char)          #不是则继续向左寻找相同字符索引


      return k


sin = 'asdd12dfg'
u = Solution().longestPalindrome(sin)
print(u)

个人小提示吧

一、

  • strip([chars]) 在字符串上执行lstrip()rstrip()
  • 这个函数并不能删除字符串内所有的空格,只能删除字符最外边的空格哦。

二、
好像没了。


三、字典

习题

1、字典基本操作

字典内容如下:

dic = {
    'python': 95,
    'java': 99,
    'c': 100
    }

用程序解答下面的题目

  • 字典的长度是多少
print(len(dic))   # 3
  • 请修改’java’ 这个key对应的value值为98
dic['java'] = 98  # {'python': 95, 'java': 98, 'c': 100}
  • 删除 c 这个key
del dic['c']   # {'python': 95, 'java': 98}
  • 增加一个key-value对,key值为 php, value是90
dic['php'] = 90   # {'python': 95, 'java': 98, 'php': 90}
  • 获取所有的key值,存储在列表里
lst = list(dic.keys())   # ['python', 'java', 'php']
  • 获取所有的value值,存储在列表里
lst1 = list(dic.values())   # [95, 98, 90]
  • 判断 javascript 是否在字典中
'javascript' in dic   # False
  • 获得字典里所有value 的和
sum = sum(lst1)   # 283
  • 获取字典里最大的value
max = max(lst1)   # 98 
  • 获取字典里最小的value
min = min(lst1)   # 90
  • 字典 dic1 = {‘php’: 97}, 将dic1的数据更新到dic中
dic1 = {'php':97}
dic.update(dic1)   # {'python': 95, 'java': 98, 'php': 97}

2、字典中的value

有一个字典,保存的是学生各个编程语言的成绩,内容如下

data = {
        'python': {'上学期': '90', '下学期': '95'},
        'c++': ['95', '96', '97'],
        'java': [{'月考':'90', '期中考试': '94', '期末考试': '98'}]
        }

各门课程的考试成绩存储方式并不相同,有的用字典,有的用列表,但是分数都是字符串类型,请实现函数transfer_score(score_dict),将分数修改成int类型

附上同学的代码,我的的代码还在诞生的路上苦苦挣扎。

def transfer_score(data):
    for keys, values in data.items():
        if keys == 'python':   # 用三个if 对症下药
            for k, v in values .items():
                values[k] = int(v)  # int强行转化为整型
        if keys == 'c++':
            i = 0
            for v in values:
                values[i] = int(v)
                i += 1
        if keys == 'java':
            for k, v in values[0].items():  # values[0] 是一个元组
                (values[0])[k] = int(v)  # (values[0])[k] 代表元组的键k


data1 = {
        'python': {'上学期': '90', '下学期': '95'},
        'c++': ['95', '96', '97'],
        'java': [{'月考': '90', '期中考试': '94', '期末考试': '98'}]
        }
transfer_score(data1)
print(data1)
''' 
{
 'python': {'上学期': 90, '下学期': 95}, 
 'c++': [95, 96, 97], 
 'java': [{'月考': 90, '期中考试': 94, '期末考试': 98}]
}
'''

tips

一、
dict.keys()返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键。

dic = {'Name': 'lsgogroup', 'Age': 7}
print(dic.keys())  # dict_keys(['Name', 'Age'])
lst = list(dic.keys())  # 转换为列表
print(lst)  # ['Name', 'Age']

dict.values()返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。

dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}
print(dic.values())
# dict_values(['female', 7, 'Zara'])

print(list(dic.values()))
# [7, 'female', 'Zara']

dict.items()以列表返回可遍历的 (键, 值) 元组数组。

dic = {'Name': 'Lsgogroup', 'Age': 7}
print(dic.items())
# dict_items([('Name', 'Lsgogroup'), ('Age', 7)])

dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回默认值。
这是得到字典中的一个值哦。

二、
直接赋值和 copy 的区别

dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}

# 引用对象
dic2 = dic1  
# 浅拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
dic3 = dic1.copy()  

print(id(dic1))  # 148635574728    
print(id(dic2))  # 148635574728    id地址没有改变,标签指向
print(id(dic3))  # 148635574344    id地址改变了,为浅复制

# 修改 data 数据
dic1['user'] = 'root'    # 更改元组中的值
dic1['num'].remove(1)     

# 输出结果
print(dic1)  # {'user': 'root', 'num': [2, 3]}
print(dic2)  # {'user': 'root', 'num': [2, 3]}    跟着dic1一起改变了
print(dic3)  # {'user': 'lsgogroup', 'num': [2, 3]}    对值赋值没有改变,但是进行函数后'num'中的1被移除了。

四、最后

我尽力了,若解释得不够准确,可以跑到这看更加详细的解释:
https://blog.csdn.net/weixin_51503843/article/details/109168952
里面有许多其他知识点的小提示。
我要继续想我的字典代码了。
来不及解释了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值