Python
is和==的区别
is检查两个对象是否是同一个对象,即它们的内存地址是否相同。如果是同一个对象,则返回True,否则返回False。
==检查两个对象是否相等,即它们的值是否相同。如果值相同,则返回True,否则返回False
标识符(变量):是对象的引用,是指向对象的内存地址的指针。
在内存中创建某对象,由python解释器为其分配内存地址
不可变对象 vs 可变对象
一旦创建,值是否可以修改
字符串 VS 列表
字符串驻留技术:为了优化内存使用,python解释器在内存中维护了一个字符串池,也称缓存。
即:创建一个新的字符串对象时,先检查其是否已经存在池里,若存在,则返回现有对象的引用,所以相同字符串字面值的内存地址是相同的。
那为什么没有列表驻留技术(doge)???
列表可变(可添加、删除或者修改元素)。
假设有此技术,会带来一些问题,比如:有两个包含相同元素的列表a,b。假设它们共享同一个内存地址,修改其中一个列表的元素,另一个列表也会受到影响。将难以调试。
为避免,解释器不会对列表进行驻留优化,而是在需要时,根据需要创建新的列表对象,确保其独立状态。
Golang
编码风格写入语法,函数式编程
变量声明+赋值
变量只能声明一次,不要重复声明!(确保每个变量都具有唯一的标识符,避免对程序造成混乱和错误)
定义了变量,一定要用!
关键字var
或者短变量声明:=
注意,短变量声明只能用于函数内部,而 var 声明可以用于全局变量和局部变量。
从内存地址角度理解:
在Go中,当我们声明一个变量时,编译器会分配一段内存区域来保存该变量的值,并使用其标识符来引用该内存区域。每个变量都具有唯一的标识符
如
a和b的值相同,但标识符不同
package main
import "fmt"
func main() {
var a int = 1
var b int = 1
fmt.Printf("a: %p\n", &a)
fmt.Printf("b: %p\n", &b)
}
a和b的值相同,但标识符不同,结果如图
%p 是一个格式化字符串,用于打印指针的内存地址。
&a 表示取变量 a 的地址,&b 同理。
常量语法
const identifier [type] = value
identifier 是常量的名称,遵循标识符的命名规则。
type 是可选的,表示常量的类型。如果不指定类型,编译器会根据值推断出类型。
value 是常量的值,常量表达式。
示例:
const Pi = 3.14159265359 // 定义一个无类型的浮点型常量
const Age int = 18 // 定义一个有类型的整型常量
const Name string = "Golang" //定义一个有类型的字符串常量
注意的是,在 Golang 中,常量的值不能被修改,否则会导致编译错误。
没有定义常量表达式,就跟前面的表达式一样
package main
import "fmt"
func main() {
const (
a = 1 // 常量 a 的值为 1
b // 常量 b 的值与上一行相同,也为 1
c = a + b // 常量 c 的值为 2
d = "Hello, world!" // 常量 d 的值为字符串 "Hello, world!"
e = iota
)
fmt.Println(a, b, c, d,)
fmt.Println(e)
}
}
在定义常量 b 的时候,我们没有显式地给它赋值,而是让它等于上一行的值,即常量 a 的值,这种方式称为“隐式赋值”。
注意,在这里隐式赋值只适用于常量的情况,对于变量则不存在这种隐式赋值的情况。
iota
是一个预定义变量,用来计数的(自增)。当使用 const 关键字定义一个枚举类型时,如果将第一个常量的值设为 iota,则随后定义的每个常量都将自动递增。从0开始计数,也可以表示第几个变量了。
golang的输入输出
可以通过标准库 fmt
和 bufio
实现。
fmt:
fmt.Scan()
函数从标准输入中读取一个空格分隔的值,并将其存储在传递给函数的参数中。当遇到换行符或EOF时,函数停止读取输入。因此,如果您想一次读取多个值,则必须在每个值后面输入一个空格。
fmt.Scanf()
函数可以使用格式字符串来指定要读取的值的类型和数量。这使得读取不同类型的数据更加方便。例如,要读取一个整数和一个字符串,您可以使用以下代码:
var i int
var s string
fmt.Scanf("%d %s", &i, &s)
fmt.Scanln()
函数会读取整行输入,直到遇到换行符为止。它将输入作为单个字符串读取,并且不需要在每个值之间输入空格。例如,要读取一行文本,您可以使用以下代码:
var s string
fmt.Scanln(&s)
fmt.Println(s)
// 结果
kjfdsg,das
kjfdsg,das
bufio
计算机组成 = 计算 + 存储 + io
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//也可以读文件
reader := bufio.NewReader(os.Stdin)
//读到换行符结束,返回结果有两个,匿名变量(_)接受变量,不使用
line, e := reader.ReadString('\n')
fmt.Println("line=", line)
fmt.Println("error=", e)
}
fmt.Print()原样输出不换行
fmt.Println()自动添加换行符和空格分隔符
fmt.Println("helllo", "world")
fmt.Println("jiangda")
//结果
hello world
jiangda
fmt.Printf()格式化输出
name := "jiangda"
fmt.Printf("hello, %s", name)
//结果
hello, jiangda