【Python】指针、字符串与元组篇

目录

指针

字符串

1 基础

2 切片

3 分割

4 相关函数

5 编码与格式化

指针

元组

例题(万年历)


指针

# python中的变量都是指针

# 所有可赋值的东西,即可以出现在赋值号“=”左边的东西,都是指针
# 指针即代表内存单元的地址
# 将指针称作“箭头”更容易理解:所有变量都是箭头,指向内存某处
# 对变量进行赋值的本质,就是让变量(箭头)指向某个地方

# a=3 : a-->3
# b=a : a-->3<--b 让b指向a所指的地方

# is运算符与==的区别
# a is b 为True   说明a和b指向同一个地方
# a==b 为True   说明a和b指向的地方放的东西相同,但是a和b不一定指向相同的地方
# a is b则一定有a==b,但反之不一定
a=[1,2,3,4]
b=[1,2,3,4]
print(a==b)
print(a is b)    #未指向同一个地方
# True
# False
c=a
print(a==c)
print(a is c)    #指向同一个地方
# True
# True
a[2]="ok"
print(c)         #y因为a和c指向同一个地方,所以修改了a[2],c[2]也会改变。它们俩是一个东西
# [1, 2, 'ok', 4]

# 对int,float,complex,str,tuple类型的变量a和b,
# 只需关注a==b是否成立,关注a is b是否成立无意义。
# 因为这些数据本身都不会更改,不会产生a指向的东西改了b指向的东西也跟着变的情况。
# 对list,dict,set类型的变量a和b,a==b和a is b的结果都需要关注。
# 因为这些数据本身会改变,改变了a指向的内容,说不定b指向的内容也变了

# 列表的元素也可以赋值,因此也是指针
# a=[1,2,3,4]   b=[1,2,3,4]
# a-->[ , , , ]
#      | | | |
#      1 2 3 4
#      | | | |
# b-->[ , , , ]-

字符串

1 基础

#转义字符
# '\'及其后的某些字符会构成转义字符,即两个字符当一个字符来看
print("hello\nworld\tok\"1\\2") #\n \t \" \\都是转义字符 分别代表换行,制表符,双引号,斜杠
# hello
# world   ok"1\2

# print(a\nb)不合法:转义字符只出现在字符串中,必须有引号

#规定'\'不转义的字符串
print(r'ab\ncd')
# ab\ncd

2 切片

# 区间是左闭右开,终点不算
a="ABCD"
print(a[1:2])
print(a[0:-1])
print(a[-3:-1])
print(a[2:])
print(a[:3])
print("abcd"[2:3])
# B
# ABC
# BC
# CD
# ABC
# c

# a[x:y:z] 每z个取一个
print("1234"[3:1:-1])
print("abcde"[::1])       #x.y省略则表示从头取到尾     该形式可实现字符串反转
print("12345678"[1:7:2])
print("12345678"[7:1:-2])
# 43
# abcde
# 246
# 864

3 分割

a="12..34.5346...a"
print(a.split(".."))
print(a.split("."))
print(a.split("34"))
# ['12', '34.5346', '.a']
# ['12', '', '34', '5346', '', '', 'a']
# ['12..', '.5', '6...a']

#存在多种分隔符的字符串分割(如将段落分割为单词)
import re
a='Beautiful, is; better*than\nugly'
print(re.split(';| |,|\*|\n',a))  #分隔串用 | 隔开
# ';'   ' '   ','    '*'    '\n'   都被看作分隔串
#   两个相邻的分隔符之间,会隔出一个空串

4 相关函数

# count 求子串出现次数
s='thisAAbb AA'
print(s.count('AA'))
# 2

#len 求字符串长度
s='1234'
print(len(s))
# 4

# upper,lower 转大小写
s="abc"
print(s.upper())
print(s)   #s本身不改变
# ABC
# abc

# find,rfind,index,rindex
# 在字符串中查找子串,返回找到的位置(下标)。找不到的话,find返回-1,index引发异常
s="1234abc567abc12"
# find从头开始找,rfind从尾巴开始找,返回第一个找到的位置
print(s.find("ab"))
print(s.rfind("ab"))
# 4
# 10
print(s.find("12",4))    #指定从下标4处开始查找
# 13
#(若要多次查找,可以将此形式与循环结合,每查找一次,起点便向后移动)
try:
    s.index("afb")       #找不到“afb”因此会产生异常
except Exception as e:
    print(e)
# substring not found

# replace 替换
s="1234abc567abc12"
b=s.replace("abc","FGHI")
print(b)
print(s)
print(s.replace("abc",""))
# 1234FGHI567FGHI12
# 1234abc567abc12
# 123456712

# isdigit()判断字符串是否是数
print("123.4".isdigit())
print("123".isdigit())
print("a123.4".isdigit())
# False
# True
# False

# islower(),isupper()是否全是小/大写等
print("Ab123".islower())
print("ab123".islower())
# False
# True

# startswith,endswith判断字符串是否以某子串开头、结尾
print("abcd".startswith("ab"))
print("abcd".endswith("bcd"))
print("abcd".endswith("bed"))
# True
# True
# False

# strip() 返回除去头尾空白字符(空格,'\r' '\t' '\n')后的字符串
# lstrip() 返回除去头部(左端)空白字符后的字符串
# rstrip() 返回除去尾部(右端)空白字符后的字符串
print(" \t12 34 \n ".strip())
print(" \t12 34 5".lstrip())
# 12 34
# 12 34 5
# strip(s),lstrip(s),rstrip(s) 返回除去两端、左端、右端在s中出现的字符后的字符串
print("takeab \n".strip("ba \n"))     #去除两端 'b','a',' ','\n'
print("cd\t12 34 5".lstrip("d\tc"))   #去除左端 'd','\t','c'
# take
# 12 34 5

isinstance函数与len函数

#isinstance函数 用来查询数据x是否是类型y
a="1233"
print(isinstance(a,str))
print(isinstance(a,int))
b=(1,3,)  #元组
print(isinstance(b,tuple))
# True
# False
# True

#len函数 用来求组合数据类型的元素个数/长度
print(len("12345"))             #求字符串长度    5
print(len([1,2,3,4]))           #求列表长度      4
print(len((1,2,3)))             #求元组长度      3
print(len({1,2,3}))             #求集合元素个数  3
print(len({'tom':2,'jack':3}))  #求字典元素个数  2

5 编码与格式化

# 字符串的编码在内存中的编码是Unicode的,虽然写入文件时可能是gkb或者utf-8的
print(ord("a"))
print(ord("好"))
print(chr(22900))
print(chr(97))
# 97
# 22909
# 奴
# a

# 字符串的格式化
# {序号:宽度.精度 类型}   (宽度可以是0
# > :右对齐
# < :左对齐
# ^ :中对齐
# 如{0:>10.4f}:
# 表示的是第0项是小数,以宽度至少是10字符,右对齐(宽度不足时空格补在左边),保留小数点后4位输出
x="Hello {0} {1:10},you get ${2:0.4f}".format("Mr.","Jack",3.2)
# {1:10}:宽度至少10字符(Jack后面用6个空格补齐)   {2:0.4f}:宽度至少是0,保留小数后四位
print(x)
# Hello Mr. Jack      ,you get $3.2000
x="Hello {0} {1:>10},you get ${2:0.4f}".format("Mr.","Jack",3.2)
# {1:>10}:宽度不足10个,空格补在左边
print(x)
# Hello Mr.       Jack,you get $3.2000
print("Today is %s.%d."%('May',21))
# Today is May.21.

指针

# 字符串的编码在内存中的编码是Unicode的,虽然写入文件时可能是gkb或者utf-8的
print(ord("a"))
print(ord("好"))
print(chr(22900))
print(chr(97))
# 97
# 22909
# 奴
# a

# 字符串的格式化
# {序号:宽度.精度 类型}   (宽度可以是0
# > :右对齐
# < :左对齐
# ^ :中对齐
# 如{0:>10.4f}:
# 表示的是第0项是小数,以宽度至少是10字符,右对齐(宽度不足时空格补在左边),保留小数点后4位输出
x="Hello {0} {1:10},you get ${2:0.4f}".format("Mr.","Jack",3.2)
# {1:10}:宽度至少10字符(Jack后面用6个空格补齐)   {2:0.4f}:宽度至少是0,保留小数后四位
print(x)
# Hello Mr. Jack      ,you get $3.2000
x="Hello {0} {1:>10},you get ${2:0.4f}".format("Mr.","Jack",3.2)
# {1:>10}:宽度不足10个,空格补在左边
print(x)
# Hello Mr.       Jack,you get $3.2000
print("Today is %s.%d."%('May',21))
# Today is May.21.

元组

# 元组不能修改,即不可增删元素,不可对元素赋值,不可修改元素顺序、
# t = 12345 ,54321 ,'hello!'
# t[0] = 0000
# TypeError: 'tuple' object does not support item assignment   远行错误,元组元素不能赋值
# t = ("a",2,3)  合法

t = 12345 ,54321 ,'hello!'    # t是一个元组
print(t[0])
print(t)
# 12345
# (12345, 54321, 'hello!')
u = t, (1 ,2 ,3 ,4 ,5)
print(u)
print(u[0][1])
print(u[1][2])
# ((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
# 54321
# 3

#元组的元素内容有可能被修改。例如,如果元素是列表,就可以修改列表
v = ("hello",[1,2,3],[3,2,1])
# v[1] = 32 则运行错误
v[1][0] = 'world'
print(v)
print(len(v))
# ('hello', ['world', 2, 3], [3, 2, 1])
# 3

# 元组的元素都是指针。
# 元组的元素不可以修改,是指不可以改变元组元素的指向,但是元组元素指向的内容,是有可能被修改的

empty = ()             # 空元组
singleton = 'hello',   # 注意末尾的"," 如果没有"," 就不是元组而是字符串了
print(len(empty))
print(len(singleton))
# 0
# 1
x = ('hello',)         # 无逗号则为字符串
print(x)
('hello',)

# 用下标访问元组,以及元组切片
tup1 = ('A','B',1997,2000)
tup2 = (1,2,3,4,5,6,7)
print(tup1[0])
print(tup2[1:5])
print(tup2[::-1])
print(tup2[-1:0:-2])
# A
# (2, 3, 4, 5)
# (7, 6, 5, 4, 3, 2, 1)
# (7, 5, 3)

# 对元组进行连接组合
tup1 = (12,34.56)
tup2 = ('abc','xyz')
# 创建一个新的元组
tup3 = tup1 + tup2
print(tup3)
# (12, 34.56, 'abc', 'xyz')
tup3 += (10,20)
print(tup3)
# (12, 34.56, 'abc', 'xyz', 10, 20)

# 元组运算和迭代
x = (1,2,3) * 3
print(x)
print(3 in (1,2,3))
# (1, 2, 3, 1, 2, 3, 1, 2, 3)
# True
for i in (1,2,3):
    print(i,end="")
# 123
print()
x = (1,2,3)
b = x
print(b is x)
# True
x += (100,)      # 新建了一个元组
print(x)
print(b)
# (1, 2, 3, 100)
# (1, 2, 3)

# 元组比大小,逐个比较,直到分出胜负
# 如果有两个对应元素不可比较,则runtime error
print((1,'a',12)<(1,'b',7))
print((1,'a')<(1,'a',13))
print((2,'a')>(1,'b',13))
# True
# True
# True
# print((2,'a')<('ab','b',13))
# TypeError: '<' not supported between instances of 'int' and 'str'

# 题:
a = [1,2,3]
b = (a,a)
b[0][1] = 100
print(a,b)
# [1, 100, 3] ([1, 100, 3], [1, 100, 3])

例题(万年历)

# 用元组(或列表)取代复杂分支结构
weekdays = "Monday", "Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"
n = int(input())
if n>7 or n<1:
    print("Illegal")
else:
    print(weekdays[n-1])

# 万年历:
# 已知2012年1月25日是星期三,编写一个程序,输入用“年 月 日”表示的一个2012年1月25日以后的日期
# 输出该日期是星期几(星期天输出0)
# 思路:2012年1月22日是星期天。算出给定日期是从该天起过了x天,然后输出x%7
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
days = 0
lst = input().split()
year,month,date = int(lst[0]),int(lst[1]),int(lst[2])
#法一
for y in range(2012,year):
    if y%4 == 0 and y%100 != 0:  # 闰年
        days += 366
    else:
        days += 365
if year%4 == 0 and year%100 != 0 or year%400 == 0:
    monthDays[2] = 29
for i in range(1,month):
    days += monthDays[i]
days += date
days -= 22  #扣掉2012年的前22天
print(days%7)
# 法二
days = 0
days += (year -2012)*365
if year > 2012:
    days += (year-2012-1)//4+1   # 补上闰年多的一天
days -= (year-2000-1)//100-(year-2000-1)//400

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,函数参数默认是传值(call by value),也就是说,当你调用一个函数时,函数会创建一个新的变量,并将原始变量的值复制到这个新变量中。在函数中对这个新变量所做的任何更改都不会影响原始变量的值。 但是,Python 也支持指针参数(call by reference),也称为引用传递。在这种情况下,函数参数实际上是原始变量的引用,而不是其值的副本。因此,在函数中对参数所做的任何更改都会影响原始变量的值。 要将参数作为指针传递,请在函数定义中将参数前面加上一个星号(*)。例如,以下代码将一个列表作为参数传递给函数,并在函数中修改该列表: ``` def modify_list(lst): lst.append(1) lst.append(2) lst.append(3) my_list = [4, 5, 6] modify_list(my_list) print(my_list) # Output: [4, 5, 6, 1, 2, 3] ``` 在这个例子中,my_list 是一个列表,它被传递给函数 modify_list()。在函数中,我们通过调用 append() 方法来修改该列表。在函数之外,我们打印了 my_list 的值,发现它已被修改。 ### 回答2: Python中的指针参数是一种特殊的函数参数类型,它允许我们传递一个变量的引用,而不是传递变量本身。通过使用指针参数,我们可以在函数内部修改外部变量的值。 在Python中,我们可以通过将变量名作为参数传递给函数来实现指针参数。当我们在函数内部修改该参数时,实际上是在修改指向该变量的引用。这意味着我们可以在函数外部访问和使用修改后的变量值。 使用指针参数有一些重要的注意事项。首先,由于指针参数实际上是变量的引用,所以任何对该引用的修改都将影响到原始变量。其次,在函数内部修改指针参数时,需要注意不要错误地创建新的引用,而是应该始终修改指向原始变量的引用。 下面是一个使用指针参数的简单示例: ``` def modify_list(lst): lst.append(4) my_list = [1, 2, 3] modify_list(my_list) print(my_list) # 输出: [1, 2, 3, 4] ``` 在这个示例中,我们定义了一个带有指针参数的函数`modify_list`,它将一个列表作为参数,并向列表中添加一个新的元素。在调用函数时,我们传递了名为`my_list`的列表,并修改了这个列表。最后,我们在函数外部打印`my_list`,发现它已经被成功修改。 总之,Python指针参数提供了一种传递变量引用并在函数内部修改原始变量的机制。通过使用指针参数,我们可以避免在函数调用过程中复制大量的数据,从而提高程序的效率。但同时,我们需要小心处理指针参数,以避免不必要的引用创建和错误的修改。 ### 回答3: 在Python中,函数的参数传递方式有两种:值传递和引用传递。 对于值传递,函数会创建一个参数的局部副本,修改副本不会影响原始参数。这是因为在Python中,基本类型的参数传递都是按值传递的方式,例如int、float、bool等。当我们在函数内部对这些参数进行修改时,只是修改了局部副本,不会影响原始参数的值。 对于引用传递,函数会传递参数的引用,而不是副本。这意味着函数内部对参数的修改会影响原始参数。在Python中,不可变类型的参数,如字符串元组、数值等,都是按值传递的方式,而可变类型的参数,如列表、字典等,则是按引用传递的方式。 可以通过指针参数来修改不可变类型的参数。在Python中,可以使用列表、字典等可变类型的对象作为参数,在函数内部修改这些对象,从而达到修改不可变类型参数的效果。这是因为可变类型的对象在传递时传递的是对象的引用,函数内部可以修改对象的值。 例如,我们可以将一个列表作为参数传递给函数,然后在函数内部通过修改列表元素的值来实现参数的修改。这样就可以达到修改不可变类型参数的效果。 总结起来,Python中的指针参数可以用来修改不可变类型的参数。但需要注意的是,不要滥用指针参数,应该根据实际需要谨慎使用,以避免产生意想不到的副作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值